转换阿拉伯数字为人名币大写

转换阿拉伯数字为人名币大写

这是本周面试的一道题,当时在现场没做出来~~~,回来之后,三下两除二就弄出来了,尬!!!

先贴下代码把:(如有错或者好的解决方案,还望大佬提出,小弟不胜感激🤭)

package com.lql.test.day_05;

import java.math.BigDecimal;
import java.util.Scanner;

/**
 * @author :BalalaEnergy
 * @date :Created in 2021/3/12 22:02
 * @description:
 * @modified By:
 */
public class TestConvertRMBNum {

    private static final String[] RMB_HAN = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] RMB_DW = {"圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};
    private static final String[] RMB_DW_POINT = {"角", "分"};
    private static final String ZERO_NUM_STR = "^(0*)+(\\.[0]{1,2})?$";
    private static final String ZERO_NUM_REGEX = "([0]{1,2})?$";

    /**
     * 亿级数最大长度
     */
    private static final int Y_LEN = 12;
    /**
     * ASCII 0
     */
    private static final int ASCII_NUM_ZERO = 48;
    /**
     * 最大精度
     */
    private static final int POINT_MAX_LEN = 2;
    /**
     * 小数点
     */
    private static final String POINT = ".";
    /**
     * 错误信息
     */
    private static final String ERROR = "error";
    private static final String WHOLE_STR = "整";
    private static final String ZERO_ZERO = "00";

    public static String outRMB(String RMB) {
        // 去除00.00这种数据
        Pattern r = Pattern.compile(ZERO_NUM_STR);
        Matcher m = r.matcher(RMB);
        if (m.matches()) {
            return RMB_HAN[0] + RMB_DW[0] + WHOLE_STR;
        }

        boolean isPointNum = false;
        // 1、参数校验
        if (RMB.contains(POINT)) {
            isPointNum = true;
        }
        char[] chars = RMB.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '.') {
                continue;
            }
            int num = Integer.valueOf(chars[i]) - ASCII_NUM_ZERO;
            if (!(num >= 0 && num <= 9)) {
                return "error: 请输入0~9的阿拉伯数字,请重新输入!";
            }
        }
        if (RMB.length() > Y_LEN) {
            return "error:您输入的参数太长,请重新输入!";
        }
        if (isPointNum) {
            if (RMB.substring(RMB.indexOf(POINT) + 1).length() > POINT_MAX_LEN) {
                return "error:最大精度仅支持两位,请重新输入!";
            }
        }
        // 2、装换数字
        // 2.1 分割小数
        // 整数金额
        String strNum;
        // 小数金额
        String strPoint;
        // 整数汉字
        String strHanWhole;
        // 小数汉字
        String strHanPoint = "";
        if (isPointNum) {
            strNum = RMB.substring(0, RMB.indexOf(POINT));
            strHanWhole = convertNumToHanZi(strNum);
            strPoint = RMB.substring(RMB.indexOf(POINT) + 1);
            r = Pattern.compile(ZERO_NUM_REGEX);
            m = r.matcher(strPoint);
            if (!m.matches()) {
                strHanPoint = convertNumToHanZi(strPoint);
            }
        } else {
            strNum = RMB;
            strHanWhole = convertNumToHanZi(strNum);
        }
        // 3、添加单位
        strHanWhole = addDW(strHanWhole, 0);
        if (strHanPoint != "") {
            strHanPoint = addDW(strHanPoint, 1);
        }
        // 去除小数后的末位零
        if (strHanPoint != "" && strHanPoint.endsWith(RMB_HAN[0])) {
            strHanPoint = strHanPoint.substring(0, strHanPoint.length() - 1);
        }
        if (strHanPoint == "" || ZERO_ZERO.equals(strHanPoint)) {
            strHanWhole = strHanWhole + WHOLE_STR;
        }
        // 角加整
        if (strHanPoint.endsWith(RMB_DW_POINT[0])) {
            strHanPoint = strHanPoint + WHOLE_STR;
        }
        if (strHanPoint.endsWith(RMB_HAN[0])) {
            strHanPoint = strHanPoint.substring(0, strHanPoint.length() - 1);
        }
        if (strHanWhole.endsWith(RMB_HAN[0]) && strHanPoint.startsWith(RMB_HAN[0])) {
            strHanWhole = strHanWhole.substring(0, strHanWhole.length() -1);
        }
        return strHanWhole + strHanPoint;
    }

    /**
     * 通过传递进来的数字转换为中文汉字
     *
     * @param nums
     * @return
     */
    public static String convertNumToHanZi(String nums) {
        String hanZiNum = "";
        for (int i = 0; i < nums.length(); i++) {
            int value = Integer.valueOf(nums.substring(i, i + 1));
            for (int j = 0; j < RMB_HAN.length; j++) {
                if (value == j) {
                    hanZiNum += RMB_HAN[j];
                    break;
                }
            }
        }
        return hanZiNum;
    }

    /**
     * 通过传递的数值添加单位
     *
     * @param str  字符串
     * @param type 0:整数 1:小数
     * @return
     */
    public static String addDW(String str, int type) {
        String temp = "";
        boolean last_zero = false;
        int zero_num = 0;
        int len = str.length();
        for (int i = 0; i < str.length(); i++) {
            // 4、多个相邻的零只显示一个
            if (str.substring(i, i + 1).equals(RMB_HAN[0])) {
                zero_num++;
            } else {
                zero_num = 0;
            }
            if (zero_num > 1) {
                if (len == 4) {
                    temp = temp.substring(0, temp.length() - 1) + RMB_DW[len];
                    zero_num = 0;
                }
                --len;
                continue;
            }
            if (zero_num == 1) {
                temp += str.substring(i, i + 1);
                --len;
                continue;
            }
            switch (type) {
                case 0:
                    temp += str.substring(i, i + 1) + RMB_DW[--len];
                    break;
                case 1:
                    temp += str.substring(i, i + 1) + RMB_DW_POINT[i];
                    break;
                default:
                    break;
            }
        }
        return temp;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一金额:");
        BigDecimal num;
        try {
            num = sc.nextBigDecimal();
            String nums = num.toString();
            String msg = outRMB(nums);
            if (msg.contains(ERROR)) {
                System.out.println("提示:" + msg.substring(msg.indexOf(":") + 1));
            } else {
                System.out.println("当前金额为:" + outRMB(nums));
            }
        } catch (Exception e) {
            System.out.println("提示:您输入的参数有误,请输入0~9的阿拉伯数字");
        }

    }
}

下面说一下当时的面试情况~

​ 最近在找工作,于是面试了很多家公司,每个公司的面试题呢也做了很多,基本没什么太大的难度(毕竟面试的是初级开发人员),然后就面试有一家的题就是要求把阿拉伯数字转换为人名币大写,我以为是和之前一样,笔试,结果是上机敲代码。。。,这就算了,提供的电脑是Linux系统😂~~,提供的编译环境呢是eclipse,就是对于我平时来说用的不多的东西,就很尴尬,上机的地方是在一堆开发的后面,当时就感觉压力山大,生怕做不出来后面的大佬投来菜鸡的目光,结果,果然没做出来啊😂,而且还耗了很多时间 。。。

​ 总之就一个字:尬!!😂

总结:

​ 最后吧,个人的自身实力有待还是有待提高,这周面试的很多,也拿到了几个简历,下下周就要奔向新的战场!周五的时候和以为大佬交谈的时候大佬给我提了一些建议:

  • 认清楚学习的方向

    之前的话,自己一直想的是学习些新技术就能够成为大佬,但其实真正的大佬是对看问题的深度研究,对细节的把控与掌握,新技术得学,但更重要的是基础与细节,知识都是连贯的,修万里长城得一砖一瓦的搭建!!

  • 找到自己的职业规划

    大佬问到这个问题的时候,其实整个人都是蒙的,因为我并不理解其意思,现在想的就是提升技术,然后挣更多的钱😂,就现在也还是蒙的,我觉得这不是一件简单的事,因为的我对未来还是充满了想象!

以下是Java代码将数字转换为人民币大写的方法: ```java import java.text.DecimalFormat; public class RMBConverter { private static final String[] CN_NUM = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; private static final String[] CN_UNIT = {"", "拾", "佰", "仟"}; private static final String[] CN_SECTION = {"", "万", "亿", "万亿"}; public static String convert(double num) { if (num == 0) { return "零元整"; } long integer = (long) num; // 整数部分 StringBuilder sb = new StringBuilder(); int sectionIndex = 0; // 记录当前处理的是第几个节权位 while (integer > 0) { int section = (int) (integer % 10000); // 取最后四位 sb.insert(0, CN_SECTION[sectionIndex]); // 插入节权位 sb.insert(0, sectionToChinese(section)); // 插入节内数字 integer /= 10000; // 去掉已经处理的最后四位 sectionIndex++; // 移动到下一个节权位 } if (num < 0) { sb.insert(0, "负"); } DecimalFormat decimalFormat = new DecimalFormat("#.00"); String decimal = decimalFormat.format(num - (long) num); // 小数部分 if (decimal.equals("0.00")) { sb.append("整"); } else { sb.append(decimal.substring(2)).append("分"); sb.insert(0, decimalToChinese(decimal.substring(0, 2)) + "角"); } return sb.toString(); } private static String sectionToChinese(int section) { StringBuilder sb = new StringBuilder(); if (section == 0) { return CN_NUM[0]; } int unitIndex = 0; // 记录当前处理的是第几位 boolean zero = true; // 记录当前位是否为零 while (section > 0) { int digit = section % 10; // 取最后一位 if (digit == 0) { if (!zero) { sb.insert(0, CN_NUM[0]); // 插入零 zero = true; } } else { sb.insert(0, CN_UNIT[unitIndex]); // 插入单位 sb.insert(0, CN_NUM[digit]); // 插入数字 zero = false; } section /= 10; // 去掉已经处理的最后一位 unitIndex++; // 移动到下一位 } return sb.toString(); } private static String decimalToChinese(String decimal) { StringBuilder sb = new StringBuilder(); if (decimal.equals("00")) { return ""; } int digit1 = decimal.charAt(0) - '0'; int digit2 = decimal.charAt(1) - '0'; if (digit1 > 0) { sb.append(CN_NUM[digit1]).append("拾"); } else if (digit2 > 0) { sb.append("零"); } if (digit2 > 0) { sb.append(CN_NUM[digit2]); } return sb.toString(); } } ``` 使用方法如下: ```java double num = 123456789.12; String rmb = RMBConverter.convert(num); System.out.println(rmb); // 壹亿贰仟叁佰肆拾伍万陆仟柒百捌十玖元壹角贰分 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值