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

本文介绍了一种实现阿拉伯数字与中文数字相互转换的方法。包括如何将阿拉伯数字转换成中文数字,反之亦然。文章提供了详细的算法步骤,并附带完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

借鉴于http://blog.youkuaiyun.com/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){ //该数字是0
				if(!zero){ //上一位数不为0,执行补0
					zero = 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











评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值