最近有项目需要对金额进行归一化处理,原始的格式有很多种,例如,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