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

来源:互联网 发布:数据的指标分析体系 编辑:程序博客网 时间:2024/04/28 19:57

有时候做一些语音播报什么的,需要把数字转换为可朗读的汉字或者音节,而且要符合朗读习惯,比如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;}}


0 0
原创粉丝点击