开始学习java编程,有看到一道题目(如题),便决定自己动手实现一下,发现什么事儿都是动手比想象的难好多,借鉴了网上高手的正则表达式,请各位高手指教。
/** * Created by charleszhu on 14-2-1. */ public class NumbertoChinese { private final static String[] a_strNumber = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; private final static String[] b_strNumber = { "","","拾","佰", "仟" ,"万"}; public static void main(String[] args){ // 测试数据 String strNum = "-12230344.102212"; if(isNumber(strNum)) { String chinese = all2Chinese(strNum); System.out.println(chinese); } else{ System.out.println("您输入的不是数字"); } } // 把所有的数字放转换成汉字 private static String all2Chinese(String strNum){ // 查看是否有小数 int index = strNum.indexOf("."); // 查看是负数 int nindex = strNum.indexOf("-"); String chinese; if (nindex != -1){ if(index == -1) chinese = NumbertoChinese.zhengShu(strNum.substring(1)); else chinese = NumbertoChinese.zhengShu(strNum.substring(1,index))+" 點 "+ NumbertoChinese.xiaoShu(strNum.substring(index + 1)); chinese = "负 "+chinese; }else{ if(index == -1) chinese = NumbertoChinese.zhengShu(strNum); else chinese = NumbertoChinese.zhengShu(strNum.substring(0,index))+" 點 "+ NumbertoChinese.xiaoShu(strNum.substring(index + 1)); } return chinese; } // 处理小数部分 private static String xiaoShu(String number){ StringBuffer s0 = new StringBuffer(); for (int i = 0; i < number.length(); i++) { Character a = number.charAt(i); int num = Integer.parseInt(a.toString()); s0.append(a_strNumber[num]); } return s0.toString(); } // 处理不高于8位的整数 private static String zhengShu(String number){ int length = number.length(); StringBuffer s0 = new StringBuffer(); // 如果只有4位不到的时候 if(length<=4){ s0.append(num2Chinese(number)); }else{ // 当数字超过4位的时候 // 先计算高4位的数字 String high4 = number.substring(0,length-4); s0.append(num2Chinese(high4)).append("万"); // 在计算后面4位的数字 String low4 = number.substring(high4.length()); // 如果后面的数字小于1000,则要加汉字零 if(Integer.parseInt(low4)<=999) s0.append("零").append(num2Chinese(low4)); else s0.append(num2Chinese(low4)); } return s0.toString(); } // 将4位数字转换为汉字数字 private static String num2Chinese(String number){ int length = number.length(); StringBuffer s0 = new StringBuffer();
// 用于表示是该数字前面都是0 int flag = 0; for(int i = number.length(),j=0; i>0;i--,j++){ Character a = number.charAt(j); int num = Integer.parseInt(a.toString()); // 如果数字为零,则判断是否可以加汉字零 if(num == 0){ if(flag != 0){ // 判断是不是后面全部为0,若有一个不是,则可以加一个零 for(int s =j ;s<length;s++){ if(number.charAt(s) != '0'){ s0.append("零"); flag=0; } } } }else{ // 如果不是零,按照位数来进行加数字 String str = a_strNumber[num]+b_strNumber[i]; s0.append(str); flag=1; } } return s0.toString(); } // 判断是输入的字符串是否是数字 private static boolean isNumber(String num){ if(null == num) return false; else { return num.matches("[+-]?[1-9]+[0-9]*(\\.[0-9]+)?"); } } }