中文大写金额文字表示的程序设计和实现
在处理财务相关数据的过程中,经常会遇到需要将一个金额数字(通常是带整数和小数)转换和表示成为中文的情况。通常称为大写金额。笔者在实现这个业务需求的时候,觉得虽然看起来比较简单,也过于具体和业务化,但其实中间的思考过程和方式,还是有一些比较有趣的地方,值得分享出来,希望能够对读者有所帮助。
设计的目的
首先就是,我们知道,这种中文表示是有一定的规范的,这样设计的目的,可能包括以下几个方面:
- 减少人为书写错误的机率,这些字都比较复杂,相互间很难混淆(如阿拉伯和英文字符字符0O,l1,S5都比较容易 0)
- 提供除了阿拉伯字符数字的表现形式外,另外的一种表现形式,形成了信息的冗余,并能够相互进行验证
- 最终目的是为了减少信息篡改的可能性,提高信息的完整性、可校验性和安全性
规则和细节
在笔者的理解中,这个规范和规则具体包括:
- 金额的基本单位为"圆",小于圆的部分单位分别是"角","分"和"厘",我们暂时不讨论更小的单位
- 每个金额的(阿拉伯)数字,都有一个对应的中文字对应,称为“大写”数字,分别是壹贰叁肆伍陆七捌玖拾
- 整数部分,其实有两层表示单位的方法,一个是大的单位有"亿","万"(暂时不考虑更高的单位),一个是"仟","佰","什",两者组合,可以表示一个很大的数字,应该足够日常使用了
- 基于语义的通顺和优雅,应当在合适的地方加"零",而且不能重复使用"零"
代码实现
在正式开始之前,读者可以先考虑一下,如果是自己,可以如何处理这个问题。
基于上面的理解,笔者使用JS语言实现了一个可以将阿拉伯数字转换为中文大写金额字符串的处理程序,具体代码如下:

简单解释一下这个代码的实现思路:
- 首先将一个数字,分拆为整数部分和小数部分分别处理
- 小数部分,可以简单的拆分为角分厘进行对应
- 如果没有小数,则简单的以"整"结尾
- 整数部分,从低到高,可以将其以四个数字为一组进行分段,每段的结束字符就分别是:"圆","万","亿"
- 在段内,每一位,从低到高就可以以数字大写 + (""|"拾"|"佰"|"仟"),来表示
- 最后,将带"零"和单位的,简单表示为单位文字
- 特别要注意多位连续为零的情况的处理,这个一般可以简单的在段内处理就可以了
claude怎么说
万事不决GPT,在思维的早期节点,只有非常模糊的概念,这时候可以看看AI是怎么想的,可以加快这个思维的步骤,或者提供新的思维角度。关于这个问题,笔者也习惯性的问了一下claude。这个问题其实是挺小众的,本来不报太高的期望,只是想看看有什么新的思路。
比较意外,它虽然没有特别清晰的解释处理的过程,但给出了相关的代码,还是可以运行的,虽然在细节方面有一些欠考虑的问题,比如它搞错了大单位,生成的结果有点不伦不类,不甚通顺,也无法处理多零的问题。但确实它提供和强化了笔者将整数部分分层次的想法,和替换零文字的思路,后面再加以完善,就得到了比较满意的结果。
问题和扩展
我们还可以看到,这个代码虽然基本上实现了相应的业务需求,但还是有很多扩展和改进空间的:
- 这个程序没有对输入进行检查,包括越界和非法字符的情况
- 还没有实现反向转换的功能
- 笔者不确定这个转换时完整精确的一对一的关系,就是可能一个数值,有两种或者以上的大型表示方式而且都是正确可接受的,这会造成后续信息匹配或者检查的问题。
- 扩展到可以处理更大数字是没有机制方面的限制的,现在的问题在于已经突破了数据类型的限制,更高的位数已经没有太大的意义
如果有哪位读者对这些问题有自己的理解或者意见,或者觉得笔者的方案有问题和缺陷,或者有更好的处理方式,欢迎著文、反馈或者和笔者进行交流。
转载自:https://juejin.cn/post/7272732548790714380