数字(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
- 数字(int型范围内正整数)和中文的相互转换
- int数字与string数字的相互转换
- 中文与数字相互转换的函数
- 阿拉伯数字与中文数字的相互转换
- C++中单个数字的int类型和char类型之间的相互转换
- [Java] int型和string型的相互转换
- CString和int的相互转换
- C# int和byte的相互转换
- enum和int的相互转换
- java String和int的相互转换
- JAVA,string和int的相互转换
- C# int和byte的相互转换
- int 和 string之间的相互转换
- C++字符串和int的相互转换
- string 和 int类型的相互转换
- int和unsigned int相互转换的问题
- char与int型的相互转换
- 字符串和数字的相互转换
- RedisLua脚本开发
- 【Unity&UnityWebPlayer】UnityWebPlayer在哪里下载
- Socket http和https的使用区别
- iOS 截取当前视图
- Too many arguments error in bash
- 数字(int型范围内正整数)和中文的相互转换
- 最大子数组问题的三种方法:分治法、暴力法和非递归方法
- 485. Max Consecutive Ones leetcode array
- 项目管理学习总结(1)——产品文档的规划化管理总结
- linux第一次登录root,设置root密码
- cocaopods升级及配置Podfile文件
- 密码脱落
- 什么叫做“线程安全”?
- 知识库系统源代码——信息新增、编辑以及展示源码