import java.util.List; import java.util.Map; import com.google.common.collect.Lists; import com.google.common.collect.Maps; public class NumberToChinese { private static Map<Integer, String> unitMap = initUnitMap(); private static Map<Character, String> numberMap = initNumberMap(); private static Map<Integer, String> decimalUnitMap = initDecimalUnitMap(); public static String convertNumberToChinese(String number) { String integerPart = ""; String decimalPart = ""; if (number.contains(".")) { integerPart = number.substring(0, number.indexOf(".")); decimalPart = number.substring(number.indexOf(".") + 1); } else { integerPart = number; } String chinese = convertInteger(integerPart); if (decimalPart.isEmpty()) { chinese += "整"; } else { chinese += convertDecimal(decimalPart); } return chinese; } /** * 转换整数数部分,不考虑首位为0的情况 * * @param decimalPart * @return */ private static String convertInteger(String str) { String chinese = ""; // 反转一下,从个位开始读 List<Character> charList = Lists.charactersOf(str).reverse(); for (int i = 0; i < charList.size(); i++) { char c = charList.get(i); if (c == '0') { if (i % 4 == 0) { chinese = unitMap.get(i) + chinese; } else if (charList.get(i - 1) == '0') { continue; } else { chinese = numberMap.get(c) + chinese; } } else { chinese = numberMap.get(c) + unitMap.get(i) + chinese; } } return chinese; } /** * 转换小数部分,省略超过3的部分 * * @param decimalPart * @return */ private static String convertDecimal(String decimalPart) { if (decimalPart.length() > 3) { decimalPart = decimalPart.substring(0, 3); } String chinese = ""; List<Character> charList = Lists.charactersOf(decimalPart); for (int i = 0; i < charList.size(); i++) { char c = charList.get(i); chinese += numberMap.get(c) + decimalUnitMap.get(i); } return chinese; } private static Map<Character, String> initNumberMap() { Map<Character, String> numberMap = Maps.newHashMap(); numberMap.put('1', "壹"); numberMap.put('2', "贰"); numberMap.put('3', "叁"); numberMap.put('4', "肆"); numberMap.put('5', "伍"); numberMap.put('6', "陆"); numberMap.put('7', "柒"); numberMap.put('8', "捌"); numberMap.put('9', "玖"); numberMap.put('0', "零"); return numberMap; } private static Map<Integer, String> initDecimalUnitMap() { Map<Integer, String> unitMap = Maps.newHashMap(); unitMap.put(0, "角"); unitMap.put(1, "分"); unitMap.put(2, "厘"); return unitMap; } private static Map<Integer, String> initUnitMap() { Map<Integer, String> unitMap = Maps.newHashMap(); unitMap.put(0, "元"); unitMap.put(1, "拾"); unitMap.put(2, "佰"); unitMap.put(3, "仟"); unitMap.put(4, "万"); unitMap.put(5, "拾"); unitMap.put(6, "佰"); unitMap.put(7, "仟"); unitMap.put(8, "亿"); unitMap.put(9, "拾"); unitMap.put(10, "佰"); unitMap.put(11, "仟"); unitMap.put(12, "兆"); unitMap.put(13, "拾"); unitMap.put(14, "佰"); unitMap.put(15, "仟"); return unitMap; } }
测试结果:
@Test public void test1() { String number = "324324.234343"; String chinese = NumberToChinese.convertNumberToChinese(number); Assert.assertEquals(chinese, "叁拾贰万肆仟叁佰贰拾肆元贰角叁分肆厘"); } @Test public void test2() { String number = "32432443242343"; String chinese = NumberToChinese.convertNumberToChinese(number); Assert.assertEquals(chinese, "叁拾贰兆肆仟叁佰贰拾肆亿肆仟叁佰贰拾肆万贰仟叁佰肆拾叁元整"); } @Test public void test3() { String number = "111000100100"; String chinese = NumberToChinese.convertNumberToChinese(number); Assert.assertEquals(chinese, "壹仟壹佰壹拾亿零壹拾万零壹佰元整"); } @Test public void test4() { String number = "11100010000"; String chinese = NumberToChinese.convertNumberToChinese(number); Assert.assertEquals(chinese, "壹佰壹拾壹亿零壹万元整"); } @Test public void test5() { String number = "1110000000"; String chinese = NumberToChinese.convertNumberToChinese(number); Assert.assertEquals(chinese, "壹拾壹亿壹仟万元整"); } @Test public void test6() { String number = "1010000000"; String chinese = NumberToChinese.convertNumberToChinese(number); Assert.assertEquals(chinese, "壹拾亿壹仟万元整"); }