
上个月一张发票被财务打回第三次,批注就俩字:“重写”。我盯着金额栏那行“三万元整”看了十分钟没想明白——一个写了十年代码、天天跟二进制打交道的人,栽在了两个汉字上。
---
---
洪武十八年(1385),户部侍郎郭桓贪墨案爆雷。账册上的“一”添一笔变“三”,“十”抹两下变“千”,国库就这么被蚂蚁搬家搬空了,史载涉案折粮两千四百万石。
朱元璋的处理方式非常朱元璋:六部侍郎以下杀得人头滚滚,牵连数万人。然后下了一道影响六百年的规定——记账数字一律用“壹贰叁肆伍陆柒捌玖拾佰仟”。
防篡改原理:小写“一、二、三、十”笔画太少,添一两笔就能十变千;大写每个字结构封闭、笔画密集,想改只能整字重写。
为什么不用阿拉伯数字?更容易改——3 抹一下就是 8,1 加一竖就是 7,防伪性能约等于零。
顺带辟个谣:大写数字不是老朱发明的,武则天时期的碑刻里就有,顾炎武还专门考证过。老朱干的事是把它变成强制国标,发明者不详,推广者狠人。
---
0.5 元到底怎么写?正确答案:人民币伍角整。
三条规则说人话版:
为什么留空隙是大忌?空白就是给别人递笔——“伍角”前面添个“叁拾元”,你的五毛就成了三十块五。
“点”字不合法:票据金额单位只有元、角、分,“零点伍元”这种写法在柜台直接被打回,没有商量。
---
1. “拾”打头必须加“壹”:¥10 写成“拾元整”,等于把篡改的笔递到别人手里,规范写法是壹拾元整。
2. 零的补位规则:阿拉伯数字中间连续几个 0,大写只写一个零——¥1005.12 → 壹仟零伍元壹角贰分;但角位是 0、分位有数时,“元”后面必须补零——¥325.04 → 叁佰贰拾伍元零肆分。
3. “整”字不是想加就加:到元、到角可加整,到分禁止加。¥325.04 写成“叁佰贰拾伍元零肆分整”?恭喜,喜提退票一次。
被坑惨了的人基本都卡在第二条:零太多到底写几个?一句话——中间的零不管几个都只写一个,末尾的零一个不写,角零分非零补一个。
---
写代码的同学别笑,这块的坑比手写多十倍。
浮点精度是第一硬伤:JS 里 (1.005).toFixed(2) 得到 "1.00",Python 里 round(2.675, 2) 得到 2.67——四舍五入直接吞你一分钱。金额以“分”为单位的整数运算,这是底线,别赌运气。
万进制,不是千进制:中文四位一组(个、万、亿),英文那套 thousand/million 的分节逻辑直接套用必翻车。
最难的是哪一步?不是汉字映射,是零的状态机:中间连续零去重、末尾零全杀、角零分非零补零、纯角分金额不输出“零元”——四条规则叠加,边界用例能列几十个。
测试用例直接抄走:
| 输入 | 正确输出 |
| --- | --- |
| 0.5 | 人民币伍角整 |
| 10.00 | 人民币壹拾元整 |
| 1005.05 | 人民币壹仟零伍元零伍分 |
| 16409.02 | 人民币壹万陆仟肆佰零玖元零贰分 |
| 100000000.01 | 人民币壹亿元零壹分 |
Python 有现成的 cn2an 这类库,能不手搓就别手搓,跑全量用例再上线。手边没代码、只想核一张票据的写法?直接用本站的金额大写转换器,输入阿拉伯金额秒出规范大写——零、整、壹拾这些坑它都替你踩过了,财务退单率肉眼可见地降。
---
大写写错了,涂改一下行不行?
不行。小写金额可以划线更正加签章,大写金额涂改基本零容忍,标准动作是作废重开。
大写和小写金额对不上,听谁的?
听大写的。支付结算相关法规写得明明白白:两者不一致时以大写为准——所以系统生成时两边必须用同一份数据源,别给手填留后门。
用“圆”是不是比“元”更正规?
不是。人民银行的规范用字是“元”,“圆”是历史沿袭,银行一般不挑,但规范文书和考试里请写“元”。
评论列表 (0条)