反正是写完了,就是代码写的不怎么优雅,个人感觉思路清晰
人民币转换
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; } }