编写一个小程序,将数字转换成中文大写。如,10.5转换结果为:拾点伍
------解决方案--------------------------------------------------------
写的不是很清楚,尽量看吧,希望能帮到你,i
- Java code
public class NumToCn { /* * 关于说明: * 一、(123.45)读作(一佰贰拾叁)点(肆伍),整数部位与小数部位的读法是不同的,因此将两部份分开读; * 二、小数部分是纯数字读取,不做深入说明; * 三、整数部分读取方法 1 2 3 4 5 6 7 8 9 * 对应单位 亿 仟 佰 拾 萬 仟 佰 拾 元 * 由上下上下一组组读作:一亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玫元; * 四、出现零时的情况: * (103)读作一佰零叁,零的单位十没有读; * (10003)读作一万零叁,多个零只读一次; * (100003)读作一拾萬零叁,万位为零时单位也要读,且万之前的零都不读; * (100000003)读作一亿零叁,此时万位为零,单位不读; * 五、最多只读10亿以内的数; */ // 定义其整数部分; private String integerPart; // 定义其小数部分; private String pointPart; // 中文大写数字定义 ; private static final char num[] = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 单位定义;至于为什么这样定义,请参照说明二; private static final char unit[] = { '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '亿' }; // 假设要转换的数通过字符串形式传入构造方法中,或者其他,不多说了。 public NumToCn(String numString) { integerPart = ""; pointPart = ""; //判断这数是不是真的合格的数字; if(numString.startsWith("0")) { System.out.println("大哥,你这是什么数字啊。"); System.exit(-1); } // 判断是否是小数; if (numString.contains(".")) { // 定位点的位置; int pointLoc = numString.indexOf("."); // 得到整数部分;substring方法自查API; integerPart = numString.substring(0, pointLoc); // 得到小数部分; pointPart = numString.substring(pointLoc + 1); } else { integerPart = numString; } if(integerPart.length() > 9) { System.out.println("你丫的,搞这么大的数干什么啊?我只给你读最多9位的数,其它靠边"); System.exit(-1); } } //用于判断万位,十万位,百万位,千万位是不是都为零; public boolean searchNum() { boolean allIsZero = true; //只有九个数的数,才有可能都为零。如900002222; if(integerPart.length() == 9) { for(int i=1; i<5; i++) { int number = Integer.parseInt(String.valueOf(integerPart.charAt(i))); if(number != 0) { allIsZero = false; break; } } } return allIsZero; } //将数字转中文的主要逻辑; public String getString() { StringBuffer sb = new StringBuffer(); //用于判断前一位数是不是为零; boolean isZeroBefore = false; for (int i = 0; i < integerPart.length(); i++) { // 从左到右,得到相应的数字;本来应该写个方法明白点,时间有限,不好意思。这里是先将拿到的字符转成字符串,再转成整型。同理,自查API; int number = Integer.parseInt(String.valueOf(integerPart.charAt(i))); if (number != 0) { isZeroBefore = false; // 得到数是多少,加入的中文大写就是多少; sb.append(num[number]); // 紧接着加入相应的单位; sb.append(unit[integerPart.length() - i - 1]); //这里的条件需要说明:对应的数为零,且之前一位不是零,但万位特殊处理; }else if (number == 0 && !isZeroBefore && i != (integerPart.length()-5)) { isZeroBefore = true; sb.append(num[number]); //关于对万位的处理; }else if (number == 0 && i==(integerPart.length()-5) && !searchNum()) { //万位之前的零都去掉; while(sb.toString().endsWith("零")) { sb.deleteCharAt(sb.length()-1); } sb.append(unit[integerPart.length() - i - 1]); isZeroBefore = false; } } //小数部份,直接加数字就行了。 if (pointPart.length() > 0) { sb.append("点"); for (int i = 0; i < pointPart.length(); i++) { int number = Integer.parseInt(String.valueOf(pointPart .charAt(i))); sb.append(num[number]); } } if (pointPart.length() == 0) { sb.append("整"); } return sb.toString(); } public static void main(String[] args) { System.out.println(new NumToCn("104.19").getString()); System.out.println(new NumToCn("1004.29").getString()); System.out.println(new NumToCn("10004.39").getString()); System.out.println(new NumToCn("100004.49").getString()); System.out.println(new NumToCn("1000004.59").getString()); System.out.println(new NumToCn("10000004.69").getString()); System.out.println(new NumToCn("100000004.79").getString()); System.out.println(new NumToCn("234534.69").getString()); System.out.println(new NumToCn("324563634").getString()); System.out.println(new NumToCn("324456").getString()); System.out.println(new NumToCn("456").getString()); } }