JAVA中文数字转换为数值

最近有项目需要对金额进行归一化处理,原始的格式有很多种,例如,30万、五十万、贰拾壹万伍仟,甚至还有“五万叁仟”这种。

搜了下CSDN,大多都是数值转换为中文的,偶尔有两个中文转数值的只有源码没有说明,不是很敢用,所以只能自己研发。

首先,我们可以把这些金额归为两类,一类是包含阿拉伯数字的,一类是纯中文的,这两类需要分开处理。

对于包含阿拉伯数字的,基本上都是万以上的量级,常见的说法只有“xx万”,“xx百万”,乃至到“xx亿”。“xx百”,“xx千”这种并不符合常用说法。所以处理起来比较简单,只需要分离阿拉伯数字与中文部分,然后相乘就可以了,例如,30万=30*10000=300000。

那么怎么处理纯中文的呢?通过观察,我们可以发现,纯中文实际上是一个表达式,例如,“五万三千两百”可以转换为如下表达式:5*10000+3*1000+2*100=53200,表达式中的每个数都对应中文中的一个汉字,但是当尝试转换“贰拾壹万伍仟”的时候我们就发生了错误:2*10+1*10000+5*1000=15020,这是由于在中文语言习惯中,“贰拾壹万”表示的是210000。我们需要对表达式的计算优先级作调整,即:(2*10+1)*10000+5*1000=215000。

首先我们把中文汉字分为两类,一类是“数”,另一类是“量”

数:一、二、三、四、五、六、七、八、九、零、壹、贰、叁、肆、伍、陆、柒、捌、玖、两、俩

量:十、百、千、万、拾、佰、仟、萬

我们从字符串的左侧向右依次读取字符,当读取到“数”且不为0的时候,再往后读取两个字符(如果有的话),如果后面第一个字符是“量”,那么根据前面得到的表达式的数值sum与量进行比较,如果sum大于“量”,那么这个“数”与“量”相乘,如果sum小于“量”,那么“数”作为个位加到sum,然后sum与“量”相乘。如果后面第二个字符还是“量”,则sum与“量”相乘

下面放出程序的计算流程示意图

下面放出源码

public class ChineseChar {

    private char origin;
    private Boolean isNumber;
    private Integ
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值