Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换

  1. public class NumberToChn {  
  2.     static String CHN_NUMBER[] = {"零""一""二""三""四""五""六""七""八""九"};  
  3.     static String CHN_UNIT[] = {"""十""百""千"};          //权位  
  4.     static String CHN_UNIT_SECTION[] = {"""万""亿""万亿"}; //节权位  
  5.   
  6.     /** 
  7.      * 测试数据的数据类型 
  8.      */  
  9.     public static class Test_Data{  
  10.         int number;  
  11.         String chnNum;  
  12.         public Test_Data(int number,String chnNum){  
  13.             this.chnNum=chnNum;  
  14.             this.number=number;  
  15.         }  
  16.     }  
  17.   
  18.     /** 
  19.      * 测试数据 
  20.      */  
  21.     static Test_Data testData[]={  
  22.             new Test_Data(0,"零"),  
  23.             new Test_Data(1,"一"),  
  24.             new Test_Data(2,"二"),  
  25.             new Test_Data(3"三"),  
  26.             new Test_Data(4"四"),  
  27.             new Test_Data(5"五"),  
  28.             new Test_Data(6"六"),  
  29.             new Test_Data(7"七"),  
  30.             new Test_Data(8"八"),  
  31.             new Test_Data(9"九"),  
  32.             new Test_Data(10"一十"),  
  33.             new Test_Data(11"一十一"),  
  34.             new Test_Data(110"一百一十"),  
  35.             new Test_Data(111"一百一十一"),  
  36.             new Test_Data(100"一百"),  
  37.             new Test_Data(102"一百零二"),  
  38.             new Test_Data(1020"一千零二十"),  
  39.             new Test_Data(1001"一千零一"),  
  40.             new Test_Data(1015"一千零一十五"),  
  41.             new Test_Data(1000"一千"),  
  42.             new Test_Data(10000"一万"),  
  43.             new Test_Data(20010"二万零一十"),  
  44.             new Test_Data(20001"二万零一"),  
  45.             new Test_Data(100000"一十万"),  
  46.             new Test_Data(1000000"一百万"),  
  47.             new Test_Data(10000000"一千万"),  
  48.             new Test_Data(100000000"一亿"),  
  49.             new Test_Data(1000000000"一十亿"),  
  50.             new Test_Data(1000001000"一十亿一千"),  
  51.             new Test_Data(1000000100"一十亿零一百"),  
  52.             new Test_Data(200010"二十万零一十"),  
  53.             new Test_Data(2000105"二百万零一百零五"),  
  54.             new Test_Data(20001007"二千万一千零七"),  
  55.             new Test_Data(2000100190"二十亿零一十万零一百九十"),  
  56.             new Test_Data(1040010000"一十亿四千零一万"),  
  57.             new Test_Data(200012301"二亿零一万二千三百零一"),  
  58.             new Test_Data(2005010010"二十亿零五百零一万零一十")  
  59. //            new Test_Data(4009060200, "四十亿零九百零六万零二百"),  
  60. //            new Test_Data(4294967295, "四十二亿九千四百九十六万七千二百九十五")  
  61.   
  62.   
  63.     };  
  64.   
  65.     /** 
  66.      * 阿拉伯数字转换为中文数字的核心算法实现。 
  67.      * @param num为需要转换为中文数字的阿拉伯数字,是无符号的整形数 
  68.      * @return 
  69.      */  
  70.     public static String NumberToChn(int num) {  
  71.         StringBuffer returnStr = new StringBuffer();  
  72.         Boolean needZero = false;  
  73.         int pos=0;           //节权位的位置  
  74.         if(num==0){  
  75.             //如果num为0,进行特殊处理。  
  76.             returnStr.insert(0,CHN_NUMBER[0]);  
  77.         }  
  78.         while (num > 0) {  
  79.             int section = num % 10000;  
  80.             if (needZero) {  
  81.                 returnStr.insert(0, CHN_NUMBER[0]);  
  82.             }  
  83.             String sectionToChn = SectionNumToChn(section);  
  84.             //判断是否需要节权位  
  85.             sectionToChn += (section != 0) ? CHN_UNIT_SECTION[pos] : CHN_UNIT_SECTION[0];  
  86.             returnStr.insert(0, sectionToChn);  
  87.             needZero = ((section < 1000 && section > 0) ? true : false); //判断section中的千位上是不是为零,若为零应该添加一个零。  
  88.             pos++;  
  89.             num = num / 10000;  
  90.         }  
  91.         return returnStr.toString();  
  92.     }  
  93.   
  94.     /** 
  95.      * 将四位的section转换为中文数字 
  96.      * @param section 
  97.      * @return 
  98.      */  
  99.     public static String SectionNumToChn(int section) {  
  100.         StringBuffer returnStr = new StringBuffer();  
  101.         int unitPos = 0;       //节权位的位置编号,0-3依次为个十百千;  
  102.   
  103.         Boolean zero = true;  
  104.         while (section > 0) {  
  105.   
  106.             int v = (section % 10);  
  107.             if (v == 0) {  
  108.                 if ((section == 0) || !zero) {  
  109.                     zero = true/*需要补0,zero的作用是确保对连续的多个0,只补一个中文零*/  
  110.                     //chnStr.insert(0, chnNumChar[v]);  
  111.                     returnStr.insert(0, CHN_NUMBER[v]);  
  112.                 }  
  113.             } else {  
  114.                 zero = false//至少有一个数字不是0  
  115.                 StringBuffer tempStr = new StringBuffer(CHN_NUMBER[v]);//数字v所对应的中文数字  
  116.                 tempStr.append(CHN_UNIT[unitPos]);  //数字v所对应的中文权位  
  117.                 returnStr.insert(0, tempStr);  
  118.             }  
  119.             unitPos++; //移位  
  120.             section = section / 10;  
  121.         }  
  122.         return returnStr.toString();  
  123.     }  
  124.   
  125.     /** 
  126.      * 完成将阿拉伯数字转换为中文数字的测试 
  127.      */  
  128.     public static void TestNumToChn(){  
  129.         for(int i=0;i<testData.length;i++) {  
  130.             String str=NumberToChn(testData[i].number);  
  131.             System.out.println(testData[i].number+"\t"+testData[i].chnNum+"\t"+str+"\t"+str.equals(testData[i].chnNum));  
  132.         }  
  133.     }  
  134.   
  135.   
  136.     /** 
  137.      * 中文转换成阿拉伯数字,中文字符串除了包括0-9的中文汉字,还包括十,百,千,万等权位。 
  138.      * 此处是完成对这些权位的类型定义。 
  139.      * name是指这些权位的汉字字符串。 
  140.      * value是指权位多对应的数值的大小。诸如:十对应的值的大小为10,百对应为100等 
  141.      * secUnit若为true,代表该权位为节权位,即万,亿,万亿等 
  142.      */  
  143.     public static class Chn_Name_value{  
  144.         String name;  
  145.         int value;  
  146.         Boolean secUnit;  
  147.         public Chn_Name_value(String name,int value,Boolean secUnit){  
  148.             this.name=name;  
  149.             this.value=value;  
  150.             this.secUnit=secUnit;  
  151.         }  
  152.     }  
  153.   
  154.     static Chn_Name_value chnNameValue[]={  
  155.             new Chn_Name_value("十",10,false),  
  156.             new Chn_Name_value("百",100,false),  
  157.             new Chn_Name_value("千",1000,false),  
  158.             new Chn_Name_value("万",10000,true),  
  159.             new Chn_Name_value("亿",100000000,true)  
  160.     };  
  161.   
  162.     /** 
  163.      * 返回中文数字汉字所对应的阿拉伯数字,若str不为中文数字,则返回-1 
  164.      * @param str 
  165.      * @return 
  166.      */  
  167.     public static int ChnNumToValue(String str){  
  168.         for(int i=0;i<CHN_NUMBER.length;i++){  
  169.             if(str.equals(CHN_NUMBER[i])){  
  170.                 return i;  
  171.             }  
  172.         }  
  173.         return -1;  
  174.     }  
  175.   
  176.     /** 
  177.      * 返回中文汉字权位在chnNameValue数组中所对应的索引号,若不为中文汉字权位,则返回-1 
  178.      * @param str 
  179.      * @return 
  180.      */  
  181.     public static int ChnUnitToValue(String str){  
  182.         for(int i=0;i<chnNameValue.length;i++){  
  183.             if(str.equals(chnNameValue[i].name)){  
  184.                 return i;  
  185.             }  
  186.         }  
  187.         return -1;  
  188.     }  
  189.   
  190.     /** 
  191.      * 返回中文数字字符串所对应的int类型的阿拉伯数字 
  192.      * @param str 
  193.      * @return 
  194.      */  
  195.     public static int ChnStringToNumber(String str){  
  196.         int returnNumber=0;  
  197.         int section=0;  
  198.         int pos=0;  
  199.         int number=0;  
  200.         while (pos<str.length()){  
  201.             int num=ChnNumToValue(str.substring(pos,pos+1));  
  202.             //若num>=0,代表该位置(pos),所对应的是数字不是权位。若小于0,则表示为权位  
  203.             if(num>=0){  
  204.                 number=num;  
  205.                 pos++;  
  206.                 //pos是最好一位,直接将number加入到section中。  
  207.                 if(pos>=str.length()){  
  208.                     section+=number;  
  209.                     returnNumber+=section;  
  210.                     break;  
  211.                 }  
  212.             }else{  
  213.                 int chnNameValueIndex=ChnUnitToValue(str.substring(pos,pos+1));  
  214.                 //chnNameValue[chnNameValueIndex].secUnit==true,表示该位置所对应的权位是节权位,  
  215.                 if(chnNameValue[chnNameValueIndex].secUnit){  
  216.                     section=(section+number)*chnNameValue[chnNameValueIndex].value;  
  217.                     returnNumber+=section;  
  218.                     section=0;  
  219.                 }else{  
  220.                     section+=number*chnNameValue[chnNameValueIndex].value;  
  221.                 }  
  222.                 pos++;  
  223.                 number=0;  
  224.                 if(pos>=str.length()){  
  225.                     returnNumber+=section;  
  226.                     break;  
  227.                 }  
  228.             }  
  229.         }  
  230.         return returnNumber;  
  231.     }  
  232.   
  233.     /** 
  234.      * 完成对中文数字字符串转换成阿拉伯数字函数的测试 
  235.      */  
  236.     public static void TestChnStringToNumber(){  
  237.         for(int i=0;i<testData.length;i++){  
  238.             int number=ChnStringToNumber(testData[i].chnNum);  
  239.             System.out.println(testData[i].chnNum+"\t"+number+"\t"+testData[i].number+"\t"+(number==testData[i].number));  
  240.   
  241.         }  
  242.     }  
  243.   
  244.     public static void main(String[] args) {  
  245.         TestNumToChn();  
  246.         System.out.println("--------------------------------------------------------");  
  247.         TestChnStringToNumber();  
  248.     }  
  249. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值