输入:1000
20222
330101110
输出 :一千
二万零二百二十二
三亿三千零一十万一千一百一十
难点:1. 中间如果出现了多个0 怎么处理
2.如何实现数字和单位的组合
3.因为数是一个个拼出来的,如何不使用低效的拼接字符串
第三点问题可以用StringBuilder类解决,这个可以用append方法来一个个加字符串或者字符,直接toString
的方法就可以输出String字符串
第二点问题可以通过数组,将一到九的数字放入数组,十到万亿放入数组从而来组合如下
String[] units = { "", "十", "百", "千", "万", "十万", "百万", "千万", "亿",
"十亿", "百亿", "千亿", "万亿" };
char[] numArray = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
第一点问题可以这样考虑无论是1001还是10000001,只要出现中间了0那么就会有中文数字‘零’,但是如果
出现了多个0,那么只能读一次‘零’,所以在每一个位判断的时候,只要出现是零,就加上一个‘零’,如果后面一位比较是0且前一位也是0,那么这一位因为前面是0的时候已经加上了‘零’,那么就不需再加了,直接比较下一位如下为代码截取一段
if (isZero) {
if ('0' == val[i - 1]) {
continue;
} else {
sb.append(numArray[n]);
}
}
以下为代码:
import java.util.Scanner;
public class Read {
static String tansform(long number) {
String[] units = { "", "十", "百", "千", "万", "十万", "百万", "千万", "亿",
"十亿", "百亿", "千亿", "万亿" };
char[] numArray = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
char[] val = Long.toString(number).toCharArray();
int len = val.length;
int divnum = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
String m = val[i] + "";
int n = Integer.valueOf(m);
boolean isZero = n == 0;
String unit = units[(len - 1) - i];
if (isZero) {
if ('0' == val[i - 1]) {
continue;
} else {
sb.append(numArray[n]);
}
} else {
sb.append(numArray[n]);
sb.append(unit);
}
}
return sb.toString();
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String res;
long _number;
_number = Long.parseLong(in.nextLine().trim());
res = tansform(_number);
System.out.println(res);
}
}