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

今天看了一道把阿拉伯数字转换成中文的编程题, 想了想觉得难点在于数字中间不同位置"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 "";
	}
	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值