阿拉伯数字转人民币大写(gitbuh项目:AlgorithmPractice)

项目介绍

  • 本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;
  • 建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。

一、题目描述

  • 中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。
  • 中文大写金额数字到“圆”为止的,在“圆”之后,应写“整字,如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。
  • 阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如¥6007.14,应写成“人民币陆仟零柒元壹角肆分”。
  • 代码实现DigitalTrans

二、解题思路

其实这道题不难,直接数字转汉字就可以了,但是难在很多限制需要一个个去实现,特别是限制之间相互影响。设计思路如下:

  • 1、数据预处理:
    • 1.1、去除空格。
    • 1.2、数字判断:
    • 1.3、分解成整数部分和小数部分
      • 1)除了一个小数点和多个数字,其他字符都不对。
      • 2)以0开头的不正确(022,02.2),除了0.x
  • 2、整数部分处理:
    • 2.1、因为数值最大到仟亿,所以整数部分最多只保留十二位,仅用于测试。
    • 2.2、遇见非连续的0时进行合并操作
    • 2.3、如果整数以零结尾,则替换成圆,如果整数部分仅包括零,如0.1,则直接去掉(因为仅包括零的被替换成圆,所以以圆作为匹配)
    • 2.4、整数部分友好输出,比如将“叁拾万肆万”修改为“叁拾肆万”。
  • 3、小数部分处理:
    • 3.1、小数部分最多只保留小数点后四位,仅用于测试
    • 3.2、遇见非连续的0进行合并操作
    • 3.3、如果小数以零结尾,则直接去掉
  • 4、返回前判断:
  • 4.1、如果仅有小数,不应该以零开头,而且仅存在向0.0020这种类似的一种可能
  • 4.2、整数和小数部分合并,合并后看是否仅仅是一个空串?空串的话输出"零圆"

测试案例

String Demo01 = "1000.0100 ";
String Demo02 = "0";
String Demo021 = "000000";
String Demo022 = "000001";
String Demo023 = "0.0020";
String Demo03 = " 50001.0010";
String Demo04 = "1";
String Demo05 = " 349760.021 ";
String Demo06 = "500500846.023";
String Demo061 = "100230000456.0003";
String Demo07 = "15mkl6";
String Demo08 = "005469.16";
String Demo09 = "-1";
String ans = digitalTrans.trans(Demo01);
assert ans.equals("壹仟圆零壹分");
ans = digitalTrans.trans(Demo02);
assert ans.equals("零圆");
ans = digitalTrans.trans(Demo021);
assert ans.equals("ERROR");
ans = digitalTrans.trans(Demo022);
assert ans.equals("ERROR");
ans = digitalTrans.trans(Demo023);
assert ans.equals("贰毫");
ans = digitalTrans.trans(Demo03);
assert ans.equals("伍万零壹圆零壹毫");
ans = digitalTrans.trans(Demo04);
assert ans.equals("壹圆");
ans = digitalTrans.trans(Demo05);
assert ans.equals("叁拾肆万玖仟柒佰陆拾圆零贰分壹毫");
ans = digitalTrans.trans(Demo06);
assert ans.equals("伍亿零伍拾万零捌佰肆拾陆圆零贰分叁毫");
ans = digitalTrans.trans(Demo061);
assert ans.equals("壹仟零贰亿叁仟万零肆佰伍拾陆圆零叁厘");
ans = digitalTrans.trans(Demo07);
assert ans.equals("ERROR");
ans = digitalTrans.trans(Demo08);
assert ans.equals("ERROR");
ans = digitalTrans.trans(Demo09);
assert ans.equals("ERROR");

猜你喜欢

转载自blog.csdn.net/ljfirst/article/details/104514376