我是以更加口语化的形式转换的,例如:
2 --> 二
12 --> 十二(不是一十二)
20 ---> 二十
10001 ---> 一万零一
100001 ---> 十万零一
120023 ---> 十二万零二十三
代码如下:
private static void f1() {
Scanner scanner = new Scanner(System.in);
long num = scanner.nextLong();
String[] ch1 = {"零","一","二","三","四","五","六","七","八","九"};
String[] ch2 = {"","十","百","千"};
String[] ch3 = {"万","亿"};
String lastResult = "";
int index = 0;
int time = 0;
boolean zero = true;
while (num != 0 && num > 0) {
int s = (int)num%10;
int ss = (int)num/10;
// 这里说明是个位数。直接输出
if(s > 0 && ss == 0){
System.out.println(ch1[s]);
//这里说明是 9<x<20 的两位数
}else if(s >= 0 && ss == 1){
// 如果是10,则直接输出 十
if(s==0){
System.out.println(ch2[ss]);
}else {
// 如果是大于10小于20的数,则输出 十几
System.out.println(ch2[ss]+ch1[s]);
}
// 这里处理的则是大于等于20的数
}else {
// 将数字转换成字符串
String numStr = String.valueOf(num);
List<String> list = new ArrayList<>();
//每四位进行截取,对每一个截取出的四位数进行转换再合并
while (numStr.length()>0) {
// 如果是大于四位,则截取后四位。例如1234567,先处理 4567
if(numStr.length()>4) {
list.add(numStr.substring(numStr.length()-4,numStr.length()));
numStr = numStr.substring(0,numStr.length()-4);
}else {
// 如果不足4位,则直接截取掉全部数据
list.add(numStr.substring(0,numStr.length()));
numStr = "";
}
}
for (int i = 0; i < list.size(); i++) {
String result = "";
String str = list.get(i);
int number = Integer.valueOf(str);
if(number < 20 && str.length() < 3) {
// 如果是小于20的则直接转换
int p = number%10;
int q = number/10;
if(p > 0 && q == 0){
result = ch1[p];
}else if(p >= 0 && q == 1) {
if (p == 0) {
result = ch2[q];
} else {
result = ch2[q] + ch1[p];
}
}
} else {
for (int j = str.length()-1; j >=0; j--) {
int x = Integer.valueOf(String.valueOf(str.charAt(j)));
// 如果为0,且是个位的,则不输出零,因为如果是10或者100等,转换汉字是没有零这个汉字的
if(x == 0 && result == "") {
index++;
continue;
} else {
// 这种情况是处理 100001这种,十万零一,只会输出一个零
if(x==0) {
if(zero) {
result = ch1[x] + result;
zero = false;
}
}else {
// 如果输出的不为零了,那么下一次遇到0还是需要输出
result = ch1[x] + ch2[index] + result;
zero = true;
}
}
index++;
}
}
// 这里是组装 万、亿两个单位,特殊情况有 1000000000 和 100000001 ,所以特殊处理
if(i+1 < list.size()) {
if(!"".equals(result)){
result = ch3[time] + result;
} else {
// 如果是四个0,则result不进行任何赋值,但是因为上一步可能多赋值了一次单位,则需要进行截取掉
if(!lastResult.equals("")){
lastResult = lastResult.substring(1,lastResult.length());
result = ch3[time] + result;
}
}
} else {
// 如果是 100000000,因为前面的全是0,所以什么都不填,只输出最后的1再加上一个单位亿
if("".equals(lastResult) && list.size()>1) {
lastResult = ch3[time-1];
}
}
time++;
index = 0;
zero = true;
// result是每一轮四位数转换后的汉字,lastResult是最终的结果
lastResult = result + lastResult;
}
System.out.println(lastResult);
}
zero = true;
time = 0;
lastResult = "";
index = 0;
num = scanner.nextLong();
}
}
目前只支持一万亿以下的转化。且代码中的变量名称没有按照标准命名,日后再进行优化。功能没有问题。