大伙儿平时工作中,特别是跟钱打交道的时候,是不是经常碰到要把小写数字转成大写的那种事儿?我以前就老头疼这个,什么壹贰叁肆伍陆柒捌玖拾佰仟万亿,还有角分,一不留神就容易写错。填个报销单、合同啥的,要是金额写错了,那麻烦可就大了。
市面上倒是有不少转换工具,但要么广告多,要么用起来不顺手,有时候转换个简单的还行,复杂的或者带好几个零的就容易出岔子。我就寻思,干脆自己捣鼓一个得了,反正也不是啥登天难事儿。一来,自己用着方便;二来,也算是个小小的实践,练练手。
我的实践捣鼓过程
说干就干,我这人就喜欢瞎琢磨。下面就是我整个折腾的记录:
第一步:理清规则,这是基础中的基础。
我先把人民币大写的规则给捋清楚了。元、角、分,还有零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿这些基本单位和数字对应关系得搞明白。最麻烦的是“零”的处理,什么时候读零,什么时候不读,什么时候读一个零,什么时候连续的零也只读一个,比如1001元(壹仟零壹元)和1010元(壹仟零壹拾元)就不一样。还有就是像“拾”这个单位,如果前面没数字,比如0.1元,就是壹角,而不是拾角。这些细节都得抠清楚。
第二步:拆分数字,各个击破。
我打算先把输入的数字金额,比如说用户输入个 12345.67 这样的,先给它拆开,分成整数部分“12345”和小数部分“67”。这样处理起来思路能清晰点,不容易乱。
第三步:整数部分转换,这是核心难点。
这块是核心。我是这么想的,从右往左,四位一组来处理,因为咱们中文大写有“万”、“亿”这样的大单位,每四位一个大坎。比如“12345”,先看后四位“2345”,再看前面的“1”。
- 每一组里面,再按照个、拾、佰、仟来转换。比如“2345”就是“贰仟叁佰肆拾伍”。
- 对“零”的特殊处理也是在这一步做的。比如6008,得是“陆仟零捌元”,中间的零不能丢。但如果是6800,那就是“陆仟捌佰元整”,末尾的零就不用读出来了(除非是元结尾)。
- 还有就是连续的零,比如10001,应该是“壹万零壹元”,而不是“壹万零零零壹元”。
- “万”和“亿”单位的添加也要注意,不能重复,比如壹万万这种就不对了,应该是壹亿。
我写了个循环,一位一位地去读那个整数部分,然后根据当前位和前面一位是不是零,来决定要不要加“零”字,还要判断当前是不是到了万位、亿位这些关键节点,及时把单位(万、亿)给续上。
第四步:小数部分转换,相对简单点。
这个相对简单点。小数部分就两位,第一位是“角”,第二位是“分”。
- 如果小数部分是“.67”,那就是“陆角柒分”。
- 如果小数部分是“.07”,那就是“零柒分”,不对,应该是“柒分”,角位是零就不用读角了,除非整数部分也是零,比如0.07元,那就是“柒分”。
- 如果小数部分是“.60”,那就是“陆角整”或者直接“陆角”。
我这里处理的是,如果角和分都存在,就都转。如果角是0,分不是0,就只转分,前面补个“零”(比如壹元零伍分)。如果分是0,角不是0,就只转角,后面加个“整”。
第五步:拼接和完善,输出结果。
把整数部分、小数部分转换好的大写字符串拼接起来,再加上“元”、“角”、“分”、“整”这些单位。比如,整数部分转出来是“壹万贰仟叁佰肆拾伍”,小数部分是“陆角柒分”,那合起来就是“壹万贰仟叁佰肆拾伍元陆角柒分”。
如果小数部分都是零,或者没有小数部分,那就要加上“圆整”或“元整”。如果整数部分是零,比如0.5元,那就是“伍角”。
我还加了些简单的校验,比如输入的不是数字,或者数字太大了超出了我设定的常用范围(比如超过几千亿那种我暂时没考虑那么复杂),就给个提示说“ भाई साहब, 输入有误!”或者“金额太大了,处理不了!”之类的,哈哈,开个玩笑,就是给个正经的错误提示。
测试和结果
搞定基本逻辑后,我就开始疯狂测试。各种正常的、奇葩的数字都输进去试试看效果:
- 0 应该输出:零元整
- 0.5 应该输出:伍角
- 10 应该输出:壹拾元整
- 100 应该输出:壹佰元整
- 101 应该输出:壹佰零壹元整
- 1001 应该输出:壹仟零壹元整
- 10000 应该输出:壹万元整
- 10001.00 应该输出:壹万零壹元整
- 12345.67 应该输出:壹万贰仟叁佰肆拾伍元陆角柒分
- 500000.00 应该输出:伍拾万元整
- 6008.10 应该输出:陆仟零捌元壹角
- 205000.03 应该输出:贰拾万零伍仟元零叁分
遇到不对的就回头改逻辑,反反复复折腾了好几回,特别是那个“零”的用法,真的是最绕的。总算是能正确转换绝大部分常见情况了。肯定还有一些特别特别极端或者不规范的输入没考虑到,但日常用用应该是够了。
现在这个小工具用起来,我自己是觉得挺顺手的。输个阿拉伯数字,啪嗒一下,大写就出来了,准确率也还行。再也不用一个字一个字去想去敲了,省心!
这就是我捣鼓这个“数字金额大写转换器”的整个过程。不算啥高科技,但确实解决了我的一个实际小麻烦。希望这点经验对大伙儿有点启发,有时候自己动手丰衣足食的感觉还是挺不错的。
还没有评论,来说两句吧...