Java 数字转为可朗读中文的函数

有时候做一些语音播报什么的,需要把数字转换为可朗读的汉字或者音节,而且要符合朗读习惯,比如10001要读成“一万零一”,下面写了个函数专门做这个事

public class ChangeIntToChinese {
	
	
	static StringBuffer stringBuffer;//静态全局变量,一个用于接收字符串的stringbuffer
	
	/**
	 * 这个函数是核心,用来把传入的整数转换成汉字输出字符串
	 * @param num 传入的整数,应该在正负21亿之间
	 * @return 返回一个字符串,字符串就是汉语翻译
	 */
	public static String transInt(long num){
		
		stringBuffer=new StringBuffer();//每次使用之前清空一次,不然会带着上一次的值
		
		//先看有多少个亿
		if(num/10000/10000>0){
				int yi = (int)(num/10000/10000);//传入的数减去万亿之后的大数后,得出有多少个一亿
				changeGe(yi); //把这些一亿转换成四位数,如十一
				stringBuffer.append("亿");//加上‘亿’就变成了十一亿
		}
		if((num/10000%10000)>0){//去掉千位及以下和亿位及以上,看剩下的万位有没有值
			int wan = (int)(num/10000);//计算剩下的数中有多少万,因为只从最低位循环4遍,所以高位有什么数不用怕
			
			changeGe(wan); 
			stringBuffer.append("万");
			
	}
		if(num>=20|num<10){
			int qian = (int)(num%10000);//减去所有万以后,取余看看还剩多少
			
			changeGe(qian);
		}
		if(num>=10&&num<20){
				littleThan20((int) num);//十到20之间的数转换规则不大一样,如一十三应写作十三,所以单独列一个情况,其他的按上面算
			}
		if(num!=0){//一下几行代码的作用是消除整个stringbuffer最前和最后的‘零’,比如3510351会写作零三百五十一万零三百五十一,为了防止这种补零后的冲突,将最前面的0消去
			if(stringBuffer.length()>=0&&stringBuffer.charAt(0)=='零'){
				stringBuffer.deleteCharAt(0);
			}
		}
		if(num == 0){
			stringBuffer.append('零');
		}
		return stringBuffer.toString();
	}
	
	
	
	/**
	 * 按照亿,万,个等单位提取出四位数来传入本函数,本函数转换为中文,然后在上面函数添加上‘亿’‘万’等
	 * @param qian 要传入的四位数
	 * @return 将四位数解析为几千几百几十几,如1234解析为一千二百三十四
	 */
	public static void changeGe(int qian){
		StringBuffer littleBuffer = new StringBuffer();//每四位输出一个汉字串插入到外部stringbuffer中
			
			for (int i = 0; i < 4; i++) {
				int ibit = qian%10;//取出最低位进行解析
				qian = qian/10;//将四位数右移一位,即将最低位删除
				
				if(ibit!=0){//若本位不为零,则一一映射输出
				littleBuffer.append(chineseName(i));
				littleBuffer.append(chineseBit(ibit));
				//若本位为零,则要看本位的前一位是否也为零,若为零则本非省略,因为多个连续的零只读一个零,如1001,此处还要注意防止指针越界
					}else if(littleBuffer.length()>0&&littleBuffer.charAt(littleBuffer.length()-1)=='零'){
						
					}else{
						littleBuffer.append("零");
					}
				}
			if(littleBuffer.charAt(0)=='零'){//如2505520会出现二百五十万 零 五百二十 零 的情况,此处的if是将末尾的零消去(从后往前解析)
				System.out.println("四位数末尾为0");
				littleBuffer.deleteCharAt(0);
			}
			stringBuffer.append(littleBuffer.reverse());//因为是从最低位进行解析,所以要反转
			
			}
	
	/**
	 * 十到20之间的数转换规则不大一样,如一十三应写作十三,所以单独列一个情况,其他的按上面算
	 * @param num
	 * @return
	 */
	public static void littleThan20(int num) {
		int i = num%10;
		stringBuffer.append("十");
		stringBuffer.append(chineseBit(i));
	}
		
			
		
		
	
	/**
	 * 
	 * @param i 输入的某位数
	 * @return 返回这个数的汉字
	 */
	public static String chineseBit(int i){
		String ibit = "零";
		
		switch (i) {
		case 0:
			ibit = "零";
			break;
		case 1:
			ibit = "一";
			break;
		case 2:
			ibit = "二";
			break;
		case 3:
			ibit = "三";
			break;
		case 4:
			ibit = "四";
			break;
		case 5:
			ibit = "五";
			break;
		case 6:
			ibit = "六";
			break;
		case 7:
			ibit = "七";
			break;
		case 8:
			ibit = "八";
			break;
		case 9:
			ibit = "九";
			break;

		default:
			break;
		}
		return ibit;
	}
	
	/**
	 * 得到进制位的汉字表示
	 * @param tens 传入的整数是表示这是第几位
	 * @return 返回进制汉字
	 */
	public static String chineseName(int tens){
		String name = null;
		switch (tens) {
		case 0:
			name = "";
			break;
		case 1:
			name = "十";
			break;
		case 2:
			name = "百";
			break;
		case 3:
			name = "千";
			break;
		
		
		default:
			break;
		}
		return name;
	}
	
	public static String transDouble(double myDouble){
		String dbString = Double.toString(myDouble);
		String xiaoShu = dbString.replaceAll(".*\\u002E", "");
		String zhengShu = dbString.replaceAll("\\u002E.*","" );
		System.out.println("整数"+zhengShu);
		System.out.println("小数"+xiaoShu);
		String intPartion = transInt(Long.parseLong(zhengShu));
		String disPartion = "";
		for (int i = 0; i < xiaoShu.length(); i++) {
			disPartion+=chineseBit(xiaoShu.charAt(i)-48);
		}
		return intPartion+"点"+disPartion;
	}
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值