数字(int型范围内正整数)和中文的相互转换

来源:互联网 发布:生物医学数据库 编辑:程序博客网 时间:2024/06/05 11:10

借鉴于http://blog.csdn.net/jjfly999/article/details/51052492,谢谢猿友jjfly999的分享

分析:

汉字用零一二三四五六七八九作为基本计数,与阿拉伯数字靠数字偏移位置的权位不一样,中文数字是才有“数字+权位”的方式组成数字。

中文计数以万为小节,万以下没有节权,万之上是亿为节权(亿之上还有:万亿、兆、万兆、亿兆等)。

中文还有一个特点是多变的“零”,大概总结为三个规则:

1.以10000为小节,小节的结尾即使是0,也不使用“零”。

2.小节内两个非0数字之间要使用“零”。

3.当小节的“千”位是0时,若本小节的前一小节无其他数字,则不用“零”,否则就要用“零”。

算法设计:

首先定义三个字符串数组,存放数字位、节权位、权位。

然后再分两个方法实现:一个实现节权的操作处理,还有一个实现小节内的操作。

注意事项:

1.本文讨论int型范围内的正整数。

1.通过String类的charAt(index)方法获得的是字符,进行比较时采用 ==

相关的方法:


详细代码:

public class Exchange {/* * 阿拉伯数字转中文 */public String numberToChinese(int num){String[] chineseSectionPosition = {"","万","亿","万亿"}; //中文数字节权位if(num == 0){            return "零";        }int sectionPosition = 0; //节权位标识String endChineseNum = new String(); //最终转换完成的中文字符串String sectionChineseNum = new String(); //每个小节转换的字符串while(num>0){ //将阿拉伯数字从右往左每隔4位分成一个小节,在分别对每个小节进行转换处理,最后加上该小节对应的节权int section = num%10000; //获取最后一个小节(低4位数:千百十个)sectionChineseNum = eachSection(section); //将当前小节转换为中文if(section != 0){ //当前小节不为0时,添加节权sectionChineseNum = sectionChineseNum + chineseSectionPosition[sectionPosition];}num = num / 10000; //去掉已经转换的末尾4位数endChineseNum = sectionChineseNum + endChineseNum;sectionPosition++; //节权位增加1}if('零' == endChineseNum.charAt(0)){endChineseNum = endChineseNum.substring(1);}return endChineseNum;}/* * 中文转阿拉伯数字 */public int chineseToNumber(String chineseNum){int number = 0; //保存阿拉伯数字String str1 = new String(); //保存“亿”节权部分        String str2 = new String(); //保存“万”节权部分        String str3 = new String(); //保存 “” 节权部分int k = 0; //用于记录节权位置boolean deal = true; //该节权部分已经处理//去除字符串中“零”for(int i=0;i<chineseNum.length();i++){if('零' == chineseNum.charAt(i)){chineseNum = chineseNum.substring(0, i) + chineseNum.substring(i+1);}}//各部分节权处理,将中文以小节为单位截取存入不同的字符串中String str = chineseNum;for(int i=0;i<str.length();i++){if(str.charAt(i) == '亿'){ //截取“亿”前面部分str1 = str.substring(0, i);k = i+1; //“亿”的位置deal = false;}if(str.charAt(i) == '万'){//截取“亿”后面部分str2 = str.substring(k,i); //截取“万”前面部分str3 = str.substring(i+1); //截取“万”后面部分deal = false;}}if(deal){ //该数小于万str3 = str;}//将中文转换为阿拉伯数字number = eachSection(str1)*100000000 + eachSection(str2)*10000 + eachSection(str3);return number;}/* * 阿拉伯数字转中文---一个小节的操作 */public String eachSection(int num){ //重载方法    String[] chineseNumber = {"零","一","二","三","四","五","六","七","八","九"}; //中文数字位    String[] chinesePosition = {"","十","百","千"}; //中文数字权位String chineseNum = new String(); //转换的中文数字boolean zero = true; //小节内部制零判断,每个小节内部只能出现一个中文“零”for(int i=0;i<4;i++){ //每个小节中只有4位数int end = num%10; //获取末位值//判断该数字是否为0。若不是0就直接转换并加上权位,若是0,继续判断是否已经出现过中文数字“零”if(end == 0){ //该数字是0if(!zero){ //上一位数不为0,执行补0zero = true;chineseNum = chineseNumber[0] + chineseNum;}}else{ //该数字不为0,直接转换并加上权位zero = false;chineseNum = chineseNumber[end] + chinesePosition[i] + chineseNum; //数字+权位}num = num/10;}return chineseNum;}/* * 中文转阿拉伯数字---一个小节的操作 */public int eachSection(String chineseNum){ //重载方法    //map集合,用于中文转数字Map<Character,Integer> map = new HashMap<Character,Integer>();char[] ch = {'零','一','二','三','四','五','六','七','八','九'}; //数字位for(int i=0;i<ch.length;i++){map.put(ch[i],i);}//权位map.put('十',10);        map.put('百',100);        map.put('千', 1000);int result = 0; //保存转换的数字        int num = 0; //保存每一个数字for(int i=0;i<chineseNum.length();i++){int v = map.get(chineseNum.charAt(i));//判断是数字还是权位(第1个字符是数字,2个是权位。。。依次类推)if(v==10 || v==100 || v==1000){ //权位result = result + num * v;}else if(i == chineseNum.length()-1){ //判断是否为个位result = result + v;}else{ //不是个位num = v;}}return result;}}

测试:

public class Test {public static void main(String[] args) {Exchange ex = new Exchange();int i = 1212341234;String str = ex.numberToChinese(i);System.out.println(i+"---转换的中文:"+str);System.out.println(str+"---转换的数字:"+ex.chineseToNumber(str));}}

输出结果:

1212341234---转换的中文:一十二亿一千二百三十四万一千二百三十四
一十二亿一千二百三十四万一千二百三十四---转换的数字:1212341234











0 0
原创粉丝点击