将阿拉伯数字转为中文型数字
主要思想是先把数字分为整数部分及小数部分,然后根据字符串的索引从最后一位机械地转为 X千X百(个十百千万)的形式。
转换过程判断是否为零,如果为零接着判断,如果是零且正好又是重要的万元,亿元,万亿元级别的单位,则只添加单位不添加数字,否则直接跳过啥也不转。之后没转化一个数字前测试前一位是否为零,如果为零则在本单位前加零再添加数字及单位,以符合中文习惯,如1001转为一千零一,而不是一千零百零十一,小数比较简单就不做解释了,但是使用的时候发现精度会丢失,建议小数还是自己写的比较好。代码如下
public class Test2 {
public static void main(String[] args) {
splitNum();
}
public static void splitNum( ) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入千万亿元级别以下数据,最大支持999万亿元,程序将自动转为中文型记数");
double d = sc.nextDouble();
String[] arr = new String[2];
long a = (long) d ;
String zs = String.valueOf(a);
String xs = String.valueOf(d-a);
String[] chinese = "零,一,二,三,四,五,六,七,八,九,十".split(",");//數字轉漢字
String[] unit = {"","拾","佰","仟","万又 ","拾","佰","仟","亿又 ","拾","佰","仟","万亿又 ","拾","佰"};
String result= "";
for (int i = 0; i < zs.length(); i++) {
char charAt = zs.charAt(zs.length()-1-i);
if (charAt==48) {
if (i%4==0) {//当正好万元,亿元,万亿元级别为0时,不得跳过单位添加
result=unit[i]+result;
}
continue;
}else {//根据中文习惯省略零百零钱等内容,并在零头前插入零
if ((zs.length()-2-i)>=0) {
if (zs.charAt(zs.length()-2-i)==48) {
result = "零"+chinese[charAt-48]+unit[i]+result;
continue;
}
}
}
result = chinese[charAt-48]+unit[i]+result;
}
result+="元";
if (xs.length()==3) {
result =result+"又 "+chinese[xs.charAt(2)-48] +"角零分";
}else if (xs.length()>=4) {
result =result+"又 "+chinese[xs.charAt(2)-48] +"角"+chinese[xs.charAt(3)-48]+"分";
}
System.out.println(result);
}
}
测试结果如下(小数部分发生精度丢失,暂且不知道该怎么处理)
//2020.4.22更新,新学了BigDecimal类,可以调用BigDecimal.valueOf()而后转为字符串,再进行同步操作;
请输入千万亿元级别以下数据,最大支持999万亿元,程序将自动转为中文型记数
210101010101010.10
二佰一拾万亿又 零一仟零一拾亿又 零一仟零一拾万又 零一仟零一拾元又 零角九分