将阿拉伯数字的金额转换为中国传统形式
如1011 应该输出 壹仟零壹拾壹元整
参考解答
private static String[] units = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "亿万", "拾", "佰", "仟" };
private static char[] numbers = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
/*
* 零的规则:
* 个位出现0,不加零,例如:1000 不会叫做 壹仟零元整
* 分角出现0,不加零
* 其它位如果连续出现多次0,只加一个零
* 零后不跟单位,例如:没有零拾、零佰等叫法
*/
public static String convert(String rmb) {
StringBuilder sb = new StringBuilder(120);
int dotIndex = rmb.indexOf('.');
// 小数逻辑
if (dotIndex > 0) {
String decimal = rmb.substring(dotIndex+1);
rmb = rmb.substring(0, dotIndex);
if (decimal.length() >= 2) {
int n = decimal.charAt(1) - '0';
if (n > 0)
sb.append("分").append(numbers[n]);
}
if (decimal.length() >= 1) {
int n = decimal.charAt(0) - '0';
if (n > 0)
sb.append("角").append(numbers[decimal.charAt(0) - '0']);
}
} else {
sb.append("整元");
}
// 整数逻辑
int bit = 0; // 当前位数
int zeroCount = 0; // 0的个数
for (int i = rmb.length() - 1; i >= 0; i--, bit++) {
int n = rmb.charAt(i) - '0';
if (n > 0) {
// 处理零
if (zeroCount > 0) {
// 如果当前位数和0的个数不等,表示不是从个位开始数0的,这时才需加零
if (bit != zeroCount) {
sb.append(numbers[0]);
}
// 对万、亿、万亿的处理
if (bit > 12) {
sb.append(units[12]); // 万亿
} else if (bit < 12 && bit > 8) {
sb.append(units[8]); // 亿
} else if (bit < 8 && bit > 4) {
sb.append(units[4]); // 万
}
zeroCount = 0;
}
// 加单位
sb.append(units[bit]);
// 加数字
sb.append(numbers[n]);
} else {
zeroCount++;
}
}
return sb.reverse().toString();
}
@Test
public void test() {
Assert.assertEquals("壹元整", convert("1"));
Assert.assertEquals("壹拾元整", convert("10"));
Assert.assertEquals("壹万元整", convert("10000"));
Assert.assertEquals("壹亿元整", convert("100000000"));
Assert.assertEquals("壹拾亿元整", convert("1000000000"));
Assert.assertEquals("壹佰万亿元整", convert("100000000000000"));
Assert.assertEquals("壹佰万亿零壹仟亿零壹元整", convert("100100000000001"));
Assert.assertEquals("玖仟玖佰玖拾玖万亿玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元整", convert("9999999999999999"));
Assert.assertEquals("壹仟零壹拾元整", convert("1010"));
Assert.assertEquals("壹仟贰佰叁拾肆元整", convert("1234"));
Assert.assertEquals("壹仟零壹元整", convert("1001"));
Assert.assertEquals("壹仟壹佰元整", convert("1100"));
Assert.assertEquals("壹拾亿零壹万元整", convert("1000010000"));
Assert.assertEquals("壹拾万零壹佰元整", convert("100100"));
Assert.assertEquals("壹仟贰佰叁拾肆元伍角伍分", convert("1234.55"));
Assert.assertEquals("壹仟贰佰叁拾肆元陆角", convert("1234.6"));
Assert.assertEquals("壹仟贰佰叁拾肆元柒分", convert("1234.07"));
Assert.assertEquals("壹仟贰佰叁拾肆元伍角", convert("1234.50"));
}