用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
二佰一拾万亿又      零一仟零一拾亿又   零一仟零一拾万又  零一仟零一拾元又  零角九分
Java中,如果`Integer`对象表示的是一个科学记数法的数值,你可以通过以下步骤将其换为十进制整数: 1. 首先,将`Integer`对象换为`String`类型,因为科学记数法在字符串形式下更容易处理。可以使用`toString()`方法获取字符串。 ```java String scientificNum = Integer.toString(yourInteger); ``` 2. 然后,解析这个字符串,去掉前导的"0."(如果是小数),并移除'e'或'E'以及其后的指数部分。可以使用正则表达式或者手动切分字符串来完成这一步。 ```java // 使用正则表达式 Pattern pattern = Pattern.compile("\\d+\\.?e-?\\d+"); Matcher matcher = pattern.matcher(scientificNum); if (matcher.find()) { String decimalPart = matcher.group(); // 如果有负指数,则需要处理 int exponent = scientificNum.contains("E") ? scientificNum.substring(scientificNum.indexOf('E') + 1).toIntValue() : scientificNum.endsWith("e-1") ? -1 : 0; return Double.parseDouble(decimalPart) * Math.pow(10, exponent).toIntValue(); } ``` 或者手动处理: ```java int index = scientificNum.indexOf('e'); if (index != -1) { String integerPart = scientificNum.substring(0, index); int exponent = scientificNum.substring(index + 1).toIntValue(); return Integer.parseInt(integerPart) * Math.pow(10, exponent); } else if (scientificNum.startsWith("0.")) { // 移除前导零,并转为整数 scientificNum = scientificNum.substring(2); return Integer.parseInt(scientificNum); } else { return Integer.parseInt(scientificNum); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值