用java语言实现将阿拉伯记数的数字转为中文记数的文字

将阿拉伯数字转为中文型数字
主要思想是先把数字分为整数部分及小数部分,然后根据字符串的索引从最后一位机械地转为 X千X百(个十百千万)的形式。
转换过程判断是否为零,如果为零接着判断,如果是零且正好又是重要的万元,亿元,万亿元级别的单位,则只添加单位不添加数字,否则直接跳过啥也不转。之后没转化一个数字前测试前一位是否为零,如果为零则在本单位前加零再添加数字及单位,以符合中文习惯,如1001转为一千零一,而不是一千零百零十一,小数比较简单就不做解释了,但是使用的时候发现精度会丢失,建议小数还是自己写的比较好。代码如下

public class Test2 {
	public static void main(String[] args) {
		splitNum();
	}
	public static void splitNum( ) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入千万亿元级别以下数据,最大支持999万亿元,程序将自动转为中文型记数");
		double d = sc.nextDouble();
		String[] arr = new String[2];
		long a = (long) d ;
		String zs = String.valueOf(a);
		String xs = String.valueOf(d-a);
		String[] chinese = "零,一,二,三,四,五,六,七,八,九,十".split(",");//數字轉漢字
		String[] unit = {"","拾","佰","仟","万又  ","拾","佰","仟","亿又   ","拾","佰","仟","万亿又      ","拾","佰"};
		String result= "";
		for (int i = 0; i < zs.length(); i++) {
			char charAt = zs.charAt(zs.length()-1-i);
			if (charAt==48) {
				if (i%4==0) {//当正好万元,亿元,万亿元级别为0时,不得跳过单位添加
					result=unit[i]+result;
				}
				continue;
			}else {//根据中文习惯省略零百零钱等内容,并在零头前插入零
				if ((zs.length()-2-i)>=0) {
					if (zs.charAt(zs.length()-2-i)==48) {
						result = "零"+chinese[charAt-48]+unit[i]+result;
						continue;
					}
				}
			}
			result = chinese[charAt-48]+unit[i]+result;
		}
		result+="元";
		if (xs.length()==3) {
			result =result+"又  "+chinese[xs.charAt(2)-48] +"角零分";
		}else if (xs.length()>=4) {
			result =result+"又  "+chinese[xs.charAt(2)-48] +"角"+chinese[xs.charAt(3)-48]+"分";
		}
		System.out.println(result);
	}
}
测试结果如下(小数部分发生精度丢失,暂且不知道该怎么处理)
//2020.4.22更新,新学了BigDecimal类,可以调用BigDecimal.valueOf()而后转为字符串,再进行同步操作;
请输入千万亿元级别以下数据,最大支持999万亿元,程序将自动转为中文型记数
210101010101010.10
二佰一拾万亿又      零一仟零一拾亿又   零一仟零一拾万又  零一仟零一拾元又  零角九分
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值