中文数字阿拉伯数字相互转换(Java版本)

本文介绍了一种用Java实现中文数字与阿拉伯数字相互转换的方法,重点在于处理中文数字中连续零的特殊情况,并提供了转换算法的详细步骤和代码实现。通过分离和转换各个数字单位,确保转换的准确性。
摘要由CSDN通过智能技术生成

首先我们需要将上面中文数字按阿拉伯数字进行分离。这里我们先提出一个思想前提: 亿、万 这种是高级单位;千、百、十这种是低级单位。所以我们先按高级单位将上面的进行拆分。

我们得到上面的三个数字。分别是【一亿】、【七千零七十九万】、【七千一百九十七】。下面我们针对这三个数字进行翻译。
各个击破
仔细分析下上面三个中文数字,不难得出结论-上面三个数字去掉高级单位剩下的都只有低级单位了。这也是我们实现的重点【低级单位内的数字转换】

我们将三个数字分别转换完成之后,剩下的就是将他们组合。组合的问题也就是中间补零和去零的操作。

【七千零七十九万】去掉高级单位【七千零七十九】我们翻译也很简单就是将低级单位去掉变成【七零七九】及【7079】。那么上面的三位数字分别是

中文数字 去掉单位后 数字映射
一亿 一 1
七千零七十九万 七零七九 7079
七千一百九十七 七一九七 7197
三位数字翻译好之后我们进行阿拉伯数字的拼接就完成了。 170797197
友情提醒
上面的数字翻译的很是顺利。但是又这么一类数字总是事与愿违。
【一亿零七十九万零一百九十七】==【100790197】
按照上面的思路我们会有如有推理
中文数字 去掉单位后 数字映射
一亿 一 1
零七十九万 零七九 079
零一百九十七 零一九七 0197
根据表格我们拼接得到的数字是【10790197】。这个时候问题就大了去了。我们丢失了一位0。原因也很简单在中文数字中在同一高级单位维度里连续多个零的出现会同一读零。但是阿拉伯数字中确实实实在在的占位的。所以这里就会缺失一位零。

这里的情况是一开始笔者没哟注意到的。但是后来改正了。所以上面提到的合并方法是没有问题的。上面是进行数字化乘以10000的。所以这里的0也不会丢失的。

正确的拼接方案是 ((1*10000)+079)*10000+0197=100790197

这种问题反向过来同样值得注意,在阿拉伯转中文数字的时候我们需要注意0到底代表几个0

阿拉伯数字转中文数字
【100790197】 ==【一亿零七十九万零一百九十七】

【100000197】 ==【一亿零一百九十七】

下面我们将对上面的两个阿拉伯数字进行解析转换。同样我们对他们进行高位分离。这里需要注意的是我们需要从低位到高位方向进行分离

分离是从低位到高位。但是我们转换却要从高位到低位。顺序不能错。在我们阿拉伯数字转中文数字的时候非零数字注解映射转换就行了。但是遇到0的时候我们需要有一下三个条件才能转换,否则就要忽略。

第一次遇到0
数字为0
统一高位单元内后面并不是全是0
简单解释下上面三个。第一个通过一个状态为就能搞定。第二个其实就是保险点。可有可无。最重要第三点遇零后后面不能全是0.这个时候我们才可以将当前位置0翻译成零。

每个非零数字翻译后需要加上低级单位的。

所以上面的0079我们翻译的是【零七十九】

但是零七九并不是真正的汉字数字。所以我们在每一次高位翻译完成之后需要加上高位单位。所以【0079】==【零七十九万】

所以我们得出如下

阿拉伯数字 数字映射
1 一亿
0079 零七十九万
0197 零一百九十七
所以【100790197】 【一亿零七十九万零一百九十七】
阿拉伯数字 数字映射
1 一亿
0000
0197 零一百九十七
在加入高级单位时我们需要判断高级单位内数字是否有效。因为我们上面三个原因。所以0000对应的中文数字就是空字符串。这里我们认为是无效中文数字。所以万单位也就没有了。所以【100000197】
【一亿零一百九十七】
测试
光谈理论不讲实践都是扯淡。下面我们需要对我们的设计进行验证。如何验证嗯。好在我们实现的【中文数字转阿拉伯数字】、【阿拉伯数字转中文数字】 。 那么我们直接通过两个方法相互转换。看看最终是不是原来的数据就能验证出来了。话不多说、上代码

Integer right = 0;
Integer total = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值