把数字转汉语

闲来无事,写了一段把数字转成汉语读法的代码,在不考虑效率的情况下,基本可以实现数字的转化了。


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, "壹拾亿壹仟万元整");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值