/**
* 输入数字返回对应英文
* @param sourceNum
* @return
*/
public String getNumStr(int sourceNum){
if(sourceNum<1000)return want(sourceNum);
Map<Integer, String> map = getMap();
String sourceStr=sourceNum+"";
int length = sourceStr.length();
if(length%3!=0){ //把字符串长度以0补齐成3的倍数
int temp=3-length%3;
for(int i=0;i<temp;i++){
sourceStr="0"+sourceStr;
}
}
String str="";
int l=sourceStr.length();
int logo=0; //标识数据
for(int i=l-3;i>=0;i-=3){ //从后面往前取,三位一次
int pow = (int)Math.pow(1000, logo); //用来判断是多少个单位,千位内,百万内,十亿内
String substring = sourceStr.substring(i,i+3);//1取中间三个字符,组 成 "千" 这个单位
int parseInt = Integer.parseInt(substring); //把千做处理
String result1=want(parseInt);
String temp="";
//给返回值加上单位 千, 百万, 十亿
if(pow!=1 && parseInt!=0){
String unit = map.get(pow);
temp+=" "+unit+" ";
}
if(parseInt!=0){
str=result1+temp+str;
if(i==l-3 && Integer.parseInt(sourceStr.substring(l-3, l-2))==0){
str="and "+str;
}
}
logo++;
}
if( str.trim().endsWith("and")){
str=str.substring(0, str.length()-5);
}
if(str.trim().startsWith("and")){
str=str.substring(5);
}
return str;
}
/**
* 需要对0做判断,中间有0的时候用and连接,连续有0时只用一个and
* @param i
* @return
*/
public String want(int i){
Map<Integer, String> map = getMap();
if(i>=0 && i<20){
return map.get(i);
}else if(i>=20){
String s=i+"";
String str="";
String[] split = s.split("");
int l = split.length;
for (int j=1;j<l;j++) {
int k = Integer.parseInt(split[j]);//得到当前循环到的数值
if(k==0){ //当某一位是0的时候
while(j<l && k==0){
if(j==l-1 && k==0){ //一直查看到最后一位如果还是0,直接返回
return str;
}
++j; //移动到下一位
int k1=Integer.parseInt(split[j]);//对下一位查看是否为0
k=k1;
}
str+="and "; //不到最后一位就不是0了,就加一个and
}
int square10=l-1-j; //根据索引值,得知该值所在的位置,个位,百位,千位...
int pow =(int) Math.pow(10, square10); //根据数值的位置,判断是该加到什么状态,个十百千...
if(square10>1){ //还不是最后两个值
str+=map.get(k)+" "+map.get(pow)+" ";
}else if(square10==1){ //已经到了十位
String temp="";
if(!str.endsWith("and ") && str.trim().length()>0){
temp="and ";
}
str+=temp;
if(k>1){ //十位上的值是不是大于一,
str+=map.get(k*pow); //大于一的计算方式,在二十 三十 四十 里面取值,然后加上个位map取值
if(Integer.parseInt(split[j+1])>0 && l>3){ //个位上的值大于0,传递来的数字大于99
str+="-";
}else if(Integer.parseInt(split[j+1])>0 && l<=3){
str+=" ";
}
}else{ //如果小于等于一,就直接拿出最后两位,在map取值
if(k==1){ //十位上不是0
str+=map.get(k*10+Integer.parseInt(split[j+1]));
return str;
}
}
}else{ //到了个位, 到这里十位上要么有0要么是大于2
if(k!=0){ //如果不是0,取map值,是0就不写了
str+=map.get(k);
}
}
}
return str;
}
return null;
}
public Map<Integer,String> getMap(){
LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>() {
{
put(0, "zero");
put(1, "one");
put(2, "two");
put(3, "three");
put(4, "four");
put(5, "five");
put(6, "six");
put(7, "seven");
put(8, "eight");
put(9, "nine");
put(10, "ten");
put(11, "eleven");
put(12, "twelve");
put(13, "thirteen");
put(14, "fourteen");
put(15, "fifteen");
put(16, "sixteen");
put(17, "seventeen");
put(18, "eighteen");
put(19, "nineteen");
put(20, "twenty");
put(30, "thirty");
put(40, "fourty");
put(50, "fifty");
put(60, "sixty");
put(70, "seventy");
put(80, "eighty");
put(90, "ninety");
put(100, "hundred");
put(1000, "thousand");
put(1000000, "million");
put(1000000000, "billion");
}
};
return map;
}
原文:http://www.cnblogs.com/of-course/p/6339432.html