CSDN论坛中有人提出一个整数转换为中文数字叫法的问题,该问题是一道笔试题,看似简单,但具体存在一些问题。参加讨论的人很多,我也写了一个程序,似乎基本能解决问题,记录在这里。
考虑主要有以下几种情况要注意:
1)一般情况下,正确地对应中文和数字的叫法,这主要是根据“拾佰仟万”以后应该再叫“拾佰仟”万,“亿”以后应该重复“拾佰仟万”亿来确定,所以,我们给出完整的单位序列应该是“拾佰仟万拾佰仟亿拾佰仟万”(由于整形的位数限制,到这里就够了);
2)出现0的情况,习惯上就应该有一个,而且只有一个零就够了,比如:1003应该叫做一千零三
3)当在万和亿以上的数字,如果出现0,应该加上万和亿的单位,如:10030叫一万零三叁拾,1003000040叫做一拾亿零叁佰万零四拾
4)特殊的,如果有1000000001应叫一拾亿零一,中间不要有万的情况出现
5)不能出现尾部有零的叫法
6)零和亿和万均不能直接连接
import java.util.*;
public class test {
public static void main(String[] arg) {
String d="拾佰仟万拾佰仟亿拾佰仟万";
String s="零壹贰叁肆伍陆柒捌玖";
boolean zero=false, fu=false;
long value;
int count=0;
String Cvalue="";
Scanner r=new Scanner(System.in);
while(!r.hasNextInt()) {
System.out.println("Must a integer can be inputted!");
r.next();
}
value=r.nextInt();
if(value==0) {//如果为零,直接输出
Cvalue="零";
System.out.println(Cvalue);
return;
}
else if(value<0) {//做负数标记,以便以后统一处理
value=java.lang.Math.abs(value);
fu=true;
}
while(value>0) {
int b=(int)(value % 10);
if(!zero || b!=0) {//不是连续零,就需要转换数据
String t="";
if(b!=0) {//非零的正常情况
t=s.substring(b,b+1);
if(count>0) t+=d.substring(count-1,count);
zero=false;
}
else if(count!=4 && count!=8){//零的情况,且不是万和亿位,应该写零
t="零";
zero=true;
}
Cvalue=t+Cvalue;
}
if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;//在第万位,添加万
if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;//在第亿位,添加亿
count++;
value/=10;
}
Cvalue=Cvalue.replaceFirst("亿万","亿");//排除亿万连接
Cvalue=Cvalue.replaceFirst("零亿","亿");//排除零亿连接
Cvalue=Cvalue.replaceFirst("零万","万");//排除零万连接
if(Cvalue.endsWith("零")) Cvalue=Cvalue.substring(0,Cvalue.length()-1);//去除尾零
if(fu) Cvalue="负的"+Cvalue;//添加负标记
System.out.println(Cvalue);
}
}
以下是一些例子:
1000000009:壹拾亿零玖
1023000009:壹拾亿贰仟叁佰万零玖
123000809:壹亿贰仟叁佰万零捌佰零玖
1230809:壹佰贰拾叁万零捌佰零玖
18009:壹万捌仟零玖
8092:捌仟零玖拾贰
-102000390:负的壹亿零贰佰万零叁佰玖拾
100:壹佰
考虑主要有以下几种情况要注意:
1)一般情况下,正确地对应中文和数字的叫法,这主要是根据“拾佰仟万”以后应该再叫“拾佰仟”万,“亿”以后应该重复“拾佰仟万”亿来确定,所以,我们给出完整的单位序列应该是“拾佰仟万拾佰仟亿拾佰仟万”(由于整形的位数限制,到这里就够了);
2)出现0的情况,习惯上就应该有一个,而且只有一个零就够了,比如:1003应该叫做一千零三
3)当在万和亿以上的数字,如果出现0,应该加上万和亿的单位,如:10030叫一万零三叁拾,1003000040叫做一拾亿零叁佰万零四拾
4)特殊的,如果有1000000001应叫一拾亿零一,中间不要有万的情况出现
5)不能出现尾部有零的叫法
6)零和亿和万均不能直接连接
import java.util.*;
public class test {
public static void main(String[] arg) {
String d="拾佰仟万拾佰仟亿拾佰仟万";
String s="零壹贰叁肆伍陆柒捌玖";
boolean zero=false, fu=false;
long value;
int count=0;
String Cvalue="";
Scanner r=new Scanner(System.in);
while(!r.hasNextInt()) {
System.out.println("Must a integer can be inputted!");
r.next();
}
value=r.nextInt();
if(value==0) {//如果为零,直接输出
Cvalue="零";
System.out.println(Cvalue);
return;
}
else if(value<0) {//做负数标记,以便以后统一处理
value=java.lang.Math.abs(value);
fu=true;
}
while(value>0) {
int b=(int)(value % 10);
if(!zero || b!=0) {//不是连续零,就需要转换数据
String t="";
if(b!=0) {//非零的正常情况
t=s.substring(b,b+1);
if(count>0) t+=d.substring(count-1,count);
zero=false;
}
else if(count!=4 && count!=8){//零的情况,且不是万和亿位,应该写零
t="零";
zero=true;
}
Cvalue=t+Cvalue;
}
if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;//在第万位,添加万
if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;//在第亿位,添加亿
count++;
value/=10;
}
Cvalue=Cvalue.replaceFirst("亿万","亿");//排除亿万连接
Cvalue=Cvalue.replaceFirst("零亿","亿");//排除零亿连接
Cvalue=Cvalue.replaceFirst("零万","万");//排除零万连接
if(Cvalue.endsWith("零")) Cvalue=Cvalue.substring(0,Cvalue.length()-1);//去除尾零
if(fu) Cvalue="负的"+Cvalue;//添加负标记
System.out.println(Cvalue);
}
}
以下是一些例子:
1000000009:壹拾亿零玖
1023000009:壹拾亿贰仟叁佰万零玖
123000809:壹亿贰仟叁佰万零捌佰零玖
1230809:壹佰贰拾叁万零捌佰零玖
18009:壹万捌仟零玖
8092:捌仟零玖拾贰
-102000390:负的壹亿零贰佰万零叁佰玖拾
100:壹佰