/**
* 问题描述:
* 将一个键盘输入的数字转化成中文输出,使用异常捕获输入的非法字符。
* (例如:输入: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 ' ';
}
}
将阿拉伯数字转为中文大写读法
最新推荐文章于 2022-06-15 00:25:58 发布