Java将金额转成大写 博客分类: Java 编程 大小写转换Java金额人民币转大写
程序员文章站
2024-03-13 13:15:09
...
private static final Map<Long, Character> nums = new HashMap<Long, Character>(); public static final int MAX_LENGTH = 20; private static final String OVER_FLOW = "OVERFLOW"; static { nums.put(0l, '零'); nums.put(1l, '壹'); nums.put(2l, '贰'); nums.put(3l, '叁'); nums.put(4l, '肆'); nums.put(5l, '伍'); nums.put(6l, '陆'); nums.put(7l, '柒'); nums.put(8l, '捌'); nums.put(9l, '玖'); nums.put(10l, '拾'); nums.put(100l, '佰'); nums.put(1000l, '仟'); nums.put(10000l, '万'); nums.put(100000000l, '亿'); nums.put(1000000000000l, '兆'); nums.put(10000000000000000l, '京'); } /** * 转换为中文大写数字,万亿级转换,最多可到<br/> * 九千九百九十九京九千九百九十九兆九千九百九十九亿<br/> * 九千九百九十九万九千九百九十九元九角九分。<br/> * 必须是非科学计数法的数字。 * * @param money * @return */ public static String getChineseStyleMoney(double money) { return getChineseStyleMoney(String.valueOf(money)); } /** * 转换为中文大写数字,万亿级转换,最多可到<br/> * 九千九百九十九京九千九百九十九兆九千九百九十九亿<br/> * 九千九百九十九万九千九百九十九元九角九分。<br/> * 必须是非科学计数法的数字。 * * @param money * @return 中文大写数字表示的金额,如果超过额定大小,将返回<code>OVER_FLOW</code> */ public static String getChineseStyleMoney(String money) { int index = money.indexOf("."); String strNum = index > 0 ? money.substring(0, index) : money; if (strNum.length() > MAX_LENGTH) { return OVER_FLOW; } StringBuffer sb = new StringBuffer(getInteger(strNum)); if (sb.length() > 0) { sb.append("圆"); } if (index > 0) { String pointNum = money.substring(index); char c = pointNum.charAt(1); if (c - 48 != 0) { sb.append(nums.get(c - 48l)).append("角"); } if (pointNum.length() >= 3) { c = pointNum.charAt(2); if (c - 48 != 0) { sb.append(nums.get(c - 48l)).append("分"); } } } else { if (sb.length() == 0) { sb.append(nums.get(0l)); } else { sb.append("整"); } } return sb.toString(); } /** * 转换整数。 * * @return */ private static String getInteger(String strNum) { int size = strNum.length() % 4 == 0 ? strNum.length() / 4 : strNum .length() / 4 + 1; String[] parts = new String[size == 0 ? 1 : size]; StringBuffer sb = new StringBuffer(); for (int i = 0; i < size; i++) { int endIndex = strNum.length() - (size - i) * 4 + 4; int startIndex = endIndex - 4 > 0 ? endIndex - 4 : 0; parts[i] = strNum.substring(startIndex, endIndex); int part = Integer.parseInt(parts[i]); // @@ 如果sb长度为零表示前面还没有数字,这时如果part是零,就略过。 if (sb.length() == 0 && part == 0) { continue; } // @@ 如果这部分的位数≤3,并且总位数大于0,表示前面还有数字,那么 // @@ 在这部分数字前面要加“零”,如10900,被分成两部分,“1”和“0900”, // @@ 转换后分别是“壹万”和“玖佰”,那么应该要在这两部分之间加上一个“零” if (part > 0 && part <= 999 && sb.length() > 0 && sb.toString().endsWith(nums.get(0l).toString()) == false) { sb.append(nums.get(0l)); } sb.append(getChineseStyleInteger(part)); int powArg = (size - i) * 2 + 2; if (part != 0) { if (powArg >= 5 && powArg <= 7) { sb.append(nums.get(Double.valueOf(Math.pow(10, 4)) .longValue())); } else if (powArg >= 8 && powArg <= 9) { sb.append(nums.get(Double.valueOf(Math.pow(10, 8)) .longValue())); } else if (powArg >= 10 && powArg <= 11) { sb.append(nums.get(Double.valueOf(Math.pow(10, 12)) .longValue())); } else if (powArg >= 12 && powArg <= 13) { sb.append(nums.get(Double.valueOf(Math.pow(10, 16)) .longValue())); } } // @@ 这部分的数字以‘0’结尾,在转换后要加一个“零”。 if (parts[i].endsWith("0") && i != size - 1 && sb.toString().endsWith(nums.get(0l).toString()) == false) { sb.append(nums.get(0l)); } } return sb.toString(); } /** * 转换小数部分。 * * @param sub * @return */ private static String getFloat(String sub) { StringBuffer sb = new StringBuffer(); sb.append(nums.get(0l)).append("点"); for (int i = 1; i < sub.length(); i++) { char c = sub.charAt(i); sb.append(nums.get(c - 48l)); } return sb.toString(); }