/** * 问题描述: * 将一个键盘输入的数字转化成中文输出,使用异常捕获输入的非法字符。 * (例如:输入:1234567 输出:一百二拾三万四千五百六拾七) * * @author 常维军 * 创建时间:2012-8-8 * * 思想: * 对于一串数字一般读法是固定的 * 口亿口千口百口拾口万口千口百口拾口 * 1,从控制台读入一串数字 * 2,对数字转换为字符串 1234567 -------> "1234567" * 3,将字符串逆序 "1234567" -------> "7654321" * 4,格式化 "7654321" -------> "一拾二百三千四万五拾六百七" * 5,对上述字符串进行逆序后返回 "一拾二百三千四万五拾六百七" -------> "七百六拾五万四千三百二拾一" * 5,对含零值进行单独处理: * 情况如下:5000 -----> 直接返回 "五千" * 5001 -----> 返回 "五千零一" * * */import java.util.Scanner;public class TestExchange { public static void main(String[] args) { // 接收控制台输入的数字 System.out.println(numberProcess(getInt())); } /** * 安全的接受一个整数 * * @return 一个整数 */ public static int getInt() { System.out.println("请输入一个整数,按Enter键结束:"); int input = 0; Scanner sc = new Scanner(System.in); try { input = sc.nextInt(); } catch (Exception e) { input = getInt(); } return input; } public static String numberProcess(int number) { String inputProcess = String.valueOf(number); StringBuilder input = new StringBuilder(inputProcess); input.reverse(); StringBuilder outTemp = new StringBuilder(); char c; for (int i = 0; i < input.length(); i++) { c = input.charAt(i); switch (i + 1) { case 1: outTemp.append(dealWithChar(c)); break; case 2: outTemp.append('拾'); outTemp.append(dealWithChar(c)); break; case 3: outTemp.append('百'); outTemp.append(dealWithChar(c)); break; case 4: outTemp.append('千'); outTemp.append(dealWithChar(c)); break; case 5: outTemp.append('万'); outTemp.append(dealWithChar(c)); break; case 6: outTemp.append('拾'); outTemp.append(dealWithChar(c)); break; case 7: outTemp.append('百'); outTemp.append(dealWithChar(c)); break; case 8: outTemp.append('千'); outTemp.append(dealWithChar(c)); break; case 9: outTemp.append('亿'); outTemp.append(dealWithChar(c)); break; case 10: outTemp.append('拾'); outTemp.append(dealWithChar(c)); break; } } outTemp = outTemp.reverse(); StringBuilder output = new StringBuilder(); for (int i = 0; i < outTemp.length() - 1; i++) { int j = i; char ch = outTemp.charAt(i); int len = outTemp.length() - i; // 对万位情况进行处理, 如不处理,1000000,只会返回一百,同时应该保证千万位,百万位为零会多出万字的情况 if (len >= 9 && len <= 15) { if (ch == '零' && len == 9) { output.append("万"); } } // 同上,对亿位进行处理 if (len > 15) { if (ch == '零' && len == 15) { output.append("亿"); } } /** * 五万零千零百零拾一 创建输出处理临时空间 * i指针,从左向右扫描(字符的最后一位不扫描,单独处理),若不是'零',将该字符值添加到临时空间中 遇到'零' * 暂停,j指针,开始从i暂停位置开始扫描(字符的最后一位不扫描,单独处理) * 若遇到'零'继续向后扫描,没有遇到'零'结束。向临时空间中添加一个'零',i从j的位置开始继续扫描。 * * 对最后一位的处理: * 若最后一位为零:去除临时空间中的最后一个字符,即:'零' * 若最后一位不是零:将最后一位字符添加到临时空间 */ if (ch != '零') { output.append(ch); } else { char chs = outTemp.charAt(j); while (chs == '零' && j < outTemp.length() - 1) { j = j + 2; chs = outTemp.charAt(j); } output.append('零'); i = j - 1; } } // 对最后一位进行处理 char cha = outTemp.charAt(outTemp.length() - 1); if (cha != '零') { output.append(cha); } else { output.deleteCharAt(output.length() - 1); } return output.toString(); } /** * 将数字转为大写 作用: 单纯的字符转换 * * @param c * 数字的字符 */ public static char dealWithChar(char c) { switch (c) { case '0': return '零'; case '1': return '一'; case '2': return '二'; case '3': return '三'; case '4': return '四'; case '5': return '五'; case '6': return '六'; case '7': return '七'; case '8': return '八'; case '9': return '九'; } return ' '; }}