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

/**
 * 问题描述:
 * 		将一个键盘输入的数字转化成中文输出,使用异常捕获输入的非法字符。
 *      (例如:输入: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 ' ';
	}
}

原文地址:https://www.cnblogs.com/wjchang/p/3671585.html