可在项目中直接使用 Java实现中文数字和阿拉伯数字互转
网上看到一些中文数字互转的代码,感觉写得不是很精简,特意自己实现并分享一下。
如果有疑问或者发现BUG,可以随时评论。
中文转阿拉伯数字
private final Map<Character, Long> UNIT = new LinkedHashMap() {
{
put('亿', 100000000l);
put('万', 10000l);
put('千', 1000l);
put('百', 100l);
put('十', 10l);
}
};
private final Map<Character, Long> NUMBER = new HashMap() {
{
put('零', 0l);
put('一', 1l);
put('二', 2l);
put('三', 3l);
put('四', 4l);
put('五', 5l);
put('六', 6l);
put('七', 7l);
put('八', 8l);
put('九', 9l);
}
};
public long words2Number(String words) {
if (words.length() == 0) return 0;
int index;
for (Map.Entry<Character, Long> m : UNIT.entrySet()) {
index = words.indexOf(m.getKey());
if (index != -1)
//防止index=0会产生'十'情况不对
return (index == 0 ? 1 : words2Number(words.substring(0, index))) * (m.getValue())
+ words2Number(words.substring(index + 1, words.length()));
}
return NUMBER.get(words.charAt(words.length() - 1));
}
阿拉伯数字转中文
private final Map<Integer, Character> UNIT = new LinkedHashMap() {
{
put(100000000, '亿');
put(10000, '万');
put(1000, '千');
put(100, '百');
put(10, '十');
}
};
private final String[] NUMBER = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
private boolean FLAG;
public String number2Words(long num) {
//变量是为了考虑"一十" 和 "一千零一十" 这一类不同情况下'十'的叫法问题,首字段出现'十'需要移除前面的'一'
FLAG = false;
return helper(num);
}
public String helper(long num) {
if (num == 0) return NUMBER[(int) num];
StringBuffer sb = new StringBuffer();
for (Map.Entry<Integer, Character> m : UNIT.entrySet()) {
int key = m.getKey();
//考虑数字是不是比这个单位大
if (num / key >= 1) {
long remainder = num % key;
//防止出现"一十" "一十万"等这种情况
if (!(remainder == 0 && num == key && key == 10 && !FLAG))
//添加前面大的部分
sb.append(helper(num / key));
FLAG = true;
sb.append(m.getValue());
//余数是不是等于0
if (remainder != 0) {
//当中间存在0时需要补上'零'
if (remainder * 10 < key) sb.append(NUMBER[0]);
//添加后面小的部分
sb.append(helper(remainder));
}
return sb.toString();
}
}
return NUMBER[(int) num];
}