将阿拉伯数字转成大写中文数字(亲测有效)

废话不多说直接贴代码

/**
 * 
 * @Description 将阿拉伯数字转成大写中文数字:
* 注:超过亿不能使用,算法上有待优化,请各位大佬多多指点
* * @Time 2019年9月4日 下午8:21:19 * * @author 皇a马 * * @version V1.0 */
public class NumParser { private static final String CN_NUM[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; private static final String UNIT[] = { "分", "角", "元", "拾", "佰", "仟", "万", "亿" }; /** * 转成大写 * * @param num * @return */ private static String toBig(int num) { return CN_NUM[num]; } /** * 根据索引加单位 * * @param index * @return */ private static String toUnit(int index) { // 亿位以上 if (index > 10) return UNIT[(index - 4 * 2)]; // 亿位 else if (index == 10) return UNIT[7]; // 十万位-千万位 else if (index >= 7 && index < 10) return UNIT[(index - 4)]; // 其它位 else return UNIT[index]; } /** * 调用该方法即可 * @param price * @return */ public static String parseNumToCN(double price) { long p = (long) (price * 100); if (p == 0) return "零元整"; StringBuilder sb = new StringBuilder(); for (int i = String.valueOf(p).length() - 1; i >= 0; i--) { int no = (int) (p / (Math.pow(10, i)) % 10); // 转大写 if (i != 10 && i != 6 && i > 2) { sb.append(toBig(no)); } else if ((i == 10 || i == 6 || i <= 2) && no != 0) sb.append(toBig(no)); // 根据当前数字索引数加单位。 if (no != 0) sb.append(toUnit(i)); if (no == 0 && (i == 10 || i == 6 || i == 2)) sb.append(toUnit(i)); } // 利用正则剔除多余的零 Pattern pattern = Pattern.compile("零{2,}"); Matcher m = pattern.matcher(sb.toString()); String str = m.replaceAll("零"); // 剔除零 Matcher m1 = Pattern.compile("(零亿)|(零万)|(零元)").matcher(str); StringBuilder sb1 = new StringBuilder(str); Stack<Integer> stack = new Stack<>(); // 压栈 while (m1.find()) { stack.push(m1.start()); } // 从后往前剔除 while (!stack.isEmpty()) { sb1.deleteCharAt(stack.pop()); } // 如果没有分,则加“整” String s = sb1.toString(); if (!s.endsWith("分")) { sb1.append("整"); } return sb1.toString(); } // 使用时取掉测试方法 @Test public void test() { System.out.println(parseNumToCN(2019000322.5)); } }

你可能感兴趣的:(将阿拉伯数字转成大写中文数字(亲测有效))