根據人民幣大寫金額規范,轉換有幾點要注意的:
- 阿拉伯數字中間有“0”時,中文大寫金額中間可以只寫一個“零”字。如¥1,409.50,應寫成人民幣壹仟肆佰零玖元伍角。
- 阿拉伯數字中間連續有幾個“0”,中文大寫金額中間可以只寫一個“零”字,如¥6,007.14,應寫成人民幣陸仟零柒元壹角肆分。
- 阿拉伯金額數字萬位或元位是“0”,或者數字中間連續有幾個“0”,萬位、元位也是“0”,但仟位、角位不是“0”時,中文大寫金額中可以只寫一個零字,也可以不寫“零”字,如¥1,680.32,應寫成人民幣壹仟陸佰捌拾元零三角貳分,或者寫成人民幣壹仟陸佰捌拾元三角貳分;又如¥107,000.53,應寫成人民幣壹拾萬柒仟元零伍角叄分,或者寫成人民幣壹拾萬柒仟元伍角叄分。
- 阿拉伯金額數字角位是“0”,而分位不是“0”時,中文大寫金額“元”后面應寫“零”字。如¥16,409.02,應寫成人民幣壹萬陸仟肆佰零玖元零貳分;又如¥325.04,應寫成人民幣叄佰貳拾元零肆分。
- 大寫金額到“元”為止的,在“元”之后應寫上“整”或“正”字,在“角”之后可以不寫“整”或“正”字,在“分”之后的不寫”整“或”正“字。
基本思路,每4個一組,表示千、百、拾,然后加上億、萬、圓,這樣的,如果有重復的0,需要忽略
public static String moneyToChinese(BigDecimal i_money) { if(i_money.equals(BigDecimal.ZERO)){ return "零圓整"; } if (i_money.doubleValue() >= 100000000 || i_money.doubleValue() < 0.01) { return ""; } i_money = i_money.setScale(2, RoundingMode.HALF_UP); String numStr = i_money.toString(); int pointPos = numStr.indexOf('.'); String s_int = null; //整數部分 String s_point = null; //小數部分 if (pointPos >= 0) { s_int = numStr.substring(0, pointPos); s_point = numStr.substring(pointPos + 1); } else { s_int = numStr; } StringBuilder sb = new StringBuilder(); if(!"0".equals(s_int)){ int groupCount = (int) Math.ceil(s_int.length() / 4.0); for (int group = 0; group < groupCount; group++) { boolean zeroFlag = true; boolean noZeroFlag = false; int start = (s_int.length() % 4 == 0 ? 0 : (s_int.length() % 4 - 4)) + 4 * group; for (int i = 0; i < 4; i++) { if (i + start >= 0) { int value = s_int.charAt(i + start) - '0'; if (value > 0) { sb.append(CN_UPPER_NUMBER[value]); if (i < 3) { sb.append(CN_UPPER_UNIT[i]); } zeroFlag = true; noZeroFlag = true; } else if (zeroFlag) { sb.append('零'); zeroFlag = false; } } } if(sb.charAt(sb.length() - 1) == '零'){ sb.deleteCharAt(sb.length() - 1); } if(noZeroFlag || groupCount - group == 1){ sb.append(CN_GROUP[groupCount - group - 1]); } } } if (s_point == null || "00".equals(s_point)) { sb.append('整'); }else{ int j = s_point.charAt(0) - '0'; int f = s_point.charAt(1) - '0'; if(j > 0){ sb.append(CN_UPPER_NUMBER[j]).append('角'); if(f != 0){ sb.append(CN_UPPER_NUMBER[f]).append('分'); } }else if("0".equals(s_int)){ sb.append(CN_UPPER_NUMBER[f]).append('分'); }else { sb.append('零').append(CN_UPPER_NUMBER[f]).append('分'); } } return sb.toString(); } private static final char[] CN_UPPER_NUMBER = "零壹貳叄肆伍陸柒捌玖".toCharArray(); private static final char[] CN_UPPER_UNIT = "仟佰拾".toCharArray(); private static final char[] CN_GROUP = "圓萬億".toCharArray();