阿拉伯数字转化大写中文汉字问题
题目
输入一串阿拉伯数字整数,输出对应的中文大写数字
样例
123456789
壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖
1000001234
壹拾亿零壹仟贰佰叁拾肆
10000
壹万
10010
壹万零壹拾
思路
记得小学学读数的时候,从最小位从右到左,每4个数一组,如123456789,则分组为1|2345|6789,这实际上是以亿和万为分界线。
有个比较棘手的问题是0的读法,因为如果有连续0,不能输出“零零零…”,要输出一个零或不输出,因为如1|0000|1234,不能输出“壹亿零万壹仟贰佰叁拾肆”。
末尾有0,如1110,则最后一个零不能输出。
末尾全是0,则一个零都不能输出。
因此我的解法也从该分界方法处入手。
代码
Java:
public class Test9 {
public static void main(String[] args) {
// 对应大写中文数字
String[] arr1 = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
// 逆序对应每一位的单位,如12345,2对应拾,3对应佰。
String[] arr2 = {"", "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
String num = null;
int count = 0;
Scanner sc = new Scanner(System.in);
num = sc.nextLine();
int k = num.length();
for (int i = 0; i < num.length(); i++) {
// index是当前位的实际数字
int index = num.charAt(i) - 48;
if (index == 0) {
// count作用是计算连续0的个数,以亿位和万位分界,每到一个分界点就清零
count++;
} else {
count = 0;
}
// 如果没有连续的0,直接输出大写数字和单位
// 如果有,则先判断:&&左边判断当前位是否为亿位或万位,
// 右边判断该段是否全为0(如1|0000|1234,如果不加这个条件,会输出壹亿零万壹仟贰佰叁拾肆)
// 符合条件则输出该位单位,且count置0
// 每读一位k都要减一
if (count == 0) {
System.out.print(arr1[index] + arr2[k--]);
} else {
if ((arr2[k] == "亿" || arr2[k] == "万") && count != 4) {
System.out.print(arr2[k]);
count = 0;
}
// 如果当前只有一个连续0,那么需要判断后续是否全为0
// 如果不进行判断,则对于10100,如果读到第四位0,此时count为1,那么会输出壹万零壹佰零元
if (count == 1) {
boolean isSeqZero = true;
for (int j = i; j < num.length(); j++) {
if (num.charAt(j) - 48 != 0) {
isSeqZero = false;
break;
}
}
if (!isSeqZero) {
System.out.print("零");
}
}
k--;
}
}
}
}