您的位置:首页 > 编程语言 > Java开发

把一个阿拉伯数字转换成中文数字的算法

2013-03-04 23:16 519 查看
今天看了一道把阿拉伯数字转换成中文的编程题, 想了想觉得难点在于数字中间不同位置"0"的处理, 连想带写用了大半个下午, 不多说直接上代码.

目的:把类似于0102201000的数字(最高位的0是无用的, 但是不能保证别人在给出数字的时候不这么写)转换成一亿零二百二十万一千的格式,代码如下:

package test;

import java.util.Scanner;

public class Test {
public static void main(String[] args) {
System.out.println("请输入一个整数!");
String num = new Scanner(System.in).next();
if (num.length()>12) {//限定最高位为千亿(共12位数字)
System.out.println("输入数字超过最大值!");
return;
}
try {
Integer intNum = new Integer(num);//通过catch块儿过滤非整数
if (intNum == 0) {//输入若干个零
System.out.println("零");
}else {
System.out.println(format(num));//调用常规整数的转换方法
}
} catch (NumberFormatException e) {
System.out.println("您输入的不是整数!");
}
}

static String format(String num){//常规整数的转换方法
while (num.charAt(0) == '0') {//过滤输入字符串高位的0
num = num.substring(1);
}
StringBuffer temp = new StringBuffer();
for (int i = 0; i < num.length(); i++) {//将所有数字的顺序倒置
temp.append(num.charAt(num.length()-1-i));
}
num = temp.toString();
//定义三个字符串分别存储个位~千位,万位~千万位,亿位~千亿位的数字
String group1 = "";
String group2 = "";
String group3 = "";
if (num.length()>8) {//亿位~千亿位的数字
group3 = num.substring(8);
num = num.substring(0,8);
}
if (num.length()>4) {//万位~千万位的数字
group2 = num.substring(4,num.length());
num = num.substring(0,4);
}
group1 = num.substring(0,num.length());//个位~千位的数字
//分别处理三个group并拼接
String result = "";
if (!group3.equals("")) {
result = result + convert(group3) + "亿";//由于每组的四位数字转换方式相似,所以定义convert(String str)方法处理
}
if (!group2.equals("")) {
result = result + convert(group2) + "万";//由于每组的四位数字转换方式相似,所以定义convert(String str)方法处理
}
result = result + convert(group1);
//处理最终结果
result = result.replace('1', '一');
result = result.replace('2', '二');
result = result.replace('3', '三');
result = result.replace('4', '四');
result = result.replace('5', '五');
result = result.replace('6', '六');
result = result.replace('7', '七');
result = result.replace('8', '八');
result = result.replace('9', '九');
result = result.replace('0', '零');
return result;
}

//个位到千位的转换方法
static String convert(String group){
String result = "";
if (new Integer(group) == 0) {//最低位全都为零的情况
return "";
}
for (int i = 4; i >= 1; i--) {//为非零为后面加上相应的"千","百","十"等
if (group.length()>=i) {
if (!(group.charAt(i-1)=='0')) {
result = result + group.charAt(i-1) + getTitle(i-1);//调用自定义方法为非零数字加上后缀
}else {
result = result + group.charAt(i-1);
}
}
}
result = result.replace("00", "0");//出现连续的0的时候,用一个替代多个
result = result.replace("000", "0");//出现连续的0的时候,用一个替代多个
if (result.charAt(result.length()-1) == '0') {//转换完成之后如果末尾是0,要去掉这个0
result = result.substring(0,result.length()-1);
}
return result;
}
//根据非零数字位置获取其后的title("千","百","十"等)
private static String getTitle(int i) {
switch (i) {
case 3:
return "千";
case 2:
return "百";
case 1:
return "十";
default:
break;
}
return "";
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息