反正是写完了,就是代码写的不怎么优雅,个人感觉思路清晰

人民币转换

https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String money = scanner.next();
        System.out.println(getChineseNum(money));

    }

    public static StringBuilder getChineseNum(String money) {
        String[] split = money.split("\\.");
        // 小数点左边的数
        String left = split[0];
        // 小数点右边的数
        String right = split[1];
        StringBuilder builder = new StringBuilder();
        builder.append("人民币");

        // 每个数后面应该加的单位
        ArrayList<String> unitList = new ArrayList<>();
        unitList.add("万");
        unitList.add("仟");
        unitList.add("佰");
        unitList.add("拾");
        // 结束单位
        unitList.add("亿");
        unitList.add("仟");
        unitList.add("佰");
        unitList.add("拾");
        // 结束单位
        unitList.add("万");
        unitList.add("仟");
        unitList.add("佰");
        unitList.add("拾");
        unitList.add("元");

        // 中文的数字表示
        HashMap<Character, String> num2ChineseMap = new HashMap<>();
        num2ChineseMap.put('0', "零");
        num2ChineseMap.put('1', "壹");
        num2ChineseMap.put('2', "贰");
        num2ChineseMap.put('3', "叁");
        num2ChineseMap.put('4', "肆");
        num2ChineseMap.put('5', "伍");
        num2ChineseMap.put('6', "陆");
        num2ChineseMap.put('7', "柒");
        num2ChineseMap.put('8', "捌");
        num2ChineseMap.put('9', "玖");

        char[] charArray = left.toCharArray();
        int length = charArray.length;
        for (int i = 0, k = unitList.size() - length; i < length; i++, k++) {
            String chinese = num2ChineseMap.get(charArray[i]);
            String unit = unitList.get(k);

            // 注意不存在类似壹拾元这种情况,将壹去掉
            if ("壹".equals(chinese) && "拾".equals(unit)) {
                builder.append(unit);
                continue;
            }

            // 如果最后一位数是0,则不用读
            if ((i == length - 1) && "零".equals(chinese)) {
                // 注意只有一位数且还是零的情况,"元"这个单位去掉不添加。如输入0.15
                if (charArray.length == 1) {
                    continue;
                }
                // 没有零元的表达(如输入100,会出现壹佰零),所以只要元这个单位即可
                builder.append(unit);
                continue;
            }


            if ("零".equals(chinese)) {
                // 如果"零"后面是"万"或者"亿",去掉"零"
                if ("万".equals(unit) || "亿".equals(unit)) {
                    builder.append(unit);
                    continue;
                }
                // 将"零"后面的单位去掉,不然就会出现类似"零佰"这种情况
                builder.append(chinese);
                continue;
            }

            builder.append(chinese).append(unit);
        }

        // 出现多个零替换成1个
        String string = builder.toString();
        for (int i = 0; i < string.length(); i++) {
            char c = string.charAt(i);
            if (c == '零') {
                int count = 1;
                int k = i + 1;
                while (true) {
                    if (k == string.length()) {
                        break;
                    }
                    // 连续的零大于1,替换为1个零即可
                    if (string.charAt(k) != '零') {
                        if (count > 1) {
                            // 切割出多个零的字符串并替换成1个
                            string = string.replaceFirst(string.substring(i, k), "零");
                        }
                        break;
                    } else {
                        count++;
                    }
                    // 注意每次移动到下一个数
                    k++;
                }
            }
        }

        // 零后面除非是拾,否则将该"零"字符去掉
        for (int i = 0; i < string.length() - 1; i++) {
            char c1 = string.charAt(i);
            char c2 = string.charAt(i + 1);
            for (String unit : unitList) {
                if ('零' == c1 && unit.charAt(0) == c2 && '拾' != c2) {
                    string = string.substring(0, i) + string.substring(i + 1);
                }
            }

        }
        // 小数点左边的数处理完成
        builder = new StringBuilder(string);


        // 处理小数点右边的数
        char c1 = right.charAt(0);
        char c2 = right.charAt(1);
        if (c1 == '0' && c2 == '0') {
            builder.append("整");
        }

        if (c1 != '0') {
            String s1 = num2ChineseMap.get(c1);
            builder.append(s1).append("角");
        }

        if (c2 != '0') {
            String s2 = num2ChineseMap.get(c2);
            builder.append(s2).append("分");
        }

        return builder;
    }
}

全部评论

相关推荐

03-26 13:44
南华大学 Java
在看面经的花生米很野蛮:这种情况下你当然要回答,你也是吗!!!!我超喜欢他的XXXXX
点赞 评论 收藏
分享
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务