将阿拉伯数字转为中文大写读法

来源:互联网 发布:linux 显示时区 cst 8 编辑:程序博客网 时间:2024/05/19 09:16
/** * 问题描述: * 将一个键盘输入的数字转化成中文输出,使用异常捕获输入的非法字符。 *      (例如:输入: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 ' ';}}