人民币大写金额分为数字和单位两种汉字类型,“零壹贰叁肆伍陆柒捌玖”分别代表数字“0123456789”,“分角拾佰仟万亿”分别代表“0.01 0.1 10 100 1000 100000000”,除此之外还有一些汉字具有补充含义,比如“元”,“整”,“正”,但是这些汉字并不具有实际的计算能力,在计算前可以直接忽略。中文大写金额数字前应标明“人民币”字样,大写金额数字应紧接“人民币”字样填写,“人民币”字样声明了金额类型,在金额转换之前应该去除该字样。

人民币大写金额具有一定规律,我们首先分析人民币的组成规则。人民币大写金额从左往右与数字金额相对应,一般情况下,数字汉字和单位汉字构成一位真正的数字,比如“壹拾”代表数字10;如果数字的单位属于“个”,那么单位“个”省略不写,虽然“个”具有单位的性质,却因人们长期的习惯而被省略了。数字“零”在人民币中不仅仅代表数字0,它还具有省略的功能,比如“壹仟零壹”中的“零”代表了0*100和0*10。数字“亿”比较特殊,因为在人民币大写中它属于最大的单位,一般情况下,人民币大写允许两位单位汉字连续,比如“壹拾万”,值得注意的是,前一个单位必须小于后一个单位,数字“壹拾万”中的“拾”必须小于“万”,而“壹万万”的表示是错误的,应该写成“壹亿”。注:“壹亿亿”是允许的,因为单位“亿”已经达到最大,所以“亿亿”只能这样表示了,然而生活中基本碰不到“亿亿”的数量级。

人民币大写最大的特点就是数量级跃升。同样的一段数字和单位,遇到不同的“基础单位”,他们代表的意义是不同的。比如数字“1230123”对应人民币“壹佰贰拾叁万零壹佰贰拾叁”,这里“壹佰贰拾叁”的“基础单位”存在“万”和“个”,因而其分别代表了壹佰贰拾叁万和壹佰贰拾叁。所谓“基础单位”是指“个”,“万”,“亿”等10000的倍数,根据人民的习惯,如果金额达到了万的数量级就用XXX万表示,如果金额达到了亿的数量级就用XXX亿来表示,这样的表示方法能够直观的看出金额的最大量级(基础单位),而一般情况下默认省略的基础单位是“个”。如果能把握基础单位在数字计算中的作用,我们就能解析人民币大写金额,并实现转化过程。

由于人民币存在很多非数字非单位意义的汉字,同时又省略了很多有计算意义的汉字,所以我们在真正转换前需要一些特殊处理(preWork)。这些处理不仅能够使人民币金额变得简洁完整,而且为了方便数字的顺序解析,我们还需要将人民币字符翻转,从左到右单位变为从小到大(同一个基础单位)。对于“个玖拾捌佰柒仟陆万零伍拾肆佰叁仟贰亿壹”的预处理:

①  清除无意义字符

② 翻转

③ 补充单位(基础单位)“个”

④ 顺序解析,遇到基础单位“万”,判断后面的汉字是否为也是单位,如果是则补充数字“零”,否则继续顺序解析

⑤ 顺序解析,遇到基础单位“亿”,后面的字符是数字,顺序解析并结束

金额字符经过预处理极大简化了转换的过程,转换比较简单,从左到右顺序遍历字符串,每次截取出“单位”+“数字”的汉字块并计算数值,最关键的一点就是不能忘记附加基础单位,这是控制金额数量级的重要参数。

     /*规整函数:清除零,翻转金额,补充省略单位和数字*/function preWork(str){var res=new Array();str=str.split("").reverse().join("").replace(/零/g,"").replace(/元/g,"").replace(/整/g,"");while(str.length>0){//顺序添加单位if(isNumberExist(str.charAt(0))){res.push("个");                                      //数字作为结尾补充单位res.push(str.charAt(0));str=str.substring(1);continue;}if(isWeightExist(str.charAt(0))){res.push(str.charAt(0));str=str.substring(1);}else{return "";                                           //既不是数字又不是单位}//if(isWeightExist(str.charAt(0))){if(getWeight(res[res.length-1])>getWeight(str.charAt(0))){res.push("零");continue;}else{return "";}}res.push(str.charAt(0));str=str.substring(1);}return res.join("");}

解析过程同样非常简单,将金额数字单位定义在数组中,汉字金额后面是对应的数字,汉字单位后面对应的是数字单位,每次解析的过程:寻找匹配的汉字类型,如果找到该汉字,返回汉字后面的数字,如果没有找到该汉字,则返回异常(-1)。

     /*转换函数:实现转换*/function Parse(str){var sum=0;var currentWeight=0;var baseWeight=1;if(str=="")return -1;while(str.length>0){if(str.charAt(0)=="万" || str.charAt(0)=="亿"){baseWeight=baseWeight*10000;str="个"+str.substring(1);}var temp=Calculate(str.substring(0,2),baseWeight);if(temp>=0)sum+=temp;elsereturn -1;str=str.substring(2);}return sum;}

计算过程最为简单,每部分计算的结果=数字*单位*基础单位,其中如果发生解析错误,则返回异常(-1)。

     /*计算函数:计算某段数值,异常时返回-1*/function Calculate(str,unit){if(isWeightExist(str.charAt(0))){if(isNumberExist(str.charAt(1))){return getWeight(str.charAt(0))*getNumber(str.charAt(1))*unit;}else{return -1;}}//单位+数字if(isNumberExist(str.charAt(0))){if(isWeightExist(str.charAt(1))){getNumber(str.charAt(0))*getWeight(str.charAt(1))*unit;}else{return -1;}}//数字+单位//非数字或单位:异常return -1;}

其他必要的函数:

     function isNumberExist(num){var numberList=new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");if(numberList.indexOf(num)<0)return false;elsereturn true;}function isWeightExist(wei){var weightList=new Array("分","角","个","拾","佰","仟","万","亿");if(weightList.indexOf(wei)<0)return false;elsereturn true;}function getNumber(num){var numberSample=new Array("零","0","壹","1","贰","2","叁","3","肆","4","伍","5","陆","6","柒","7","捌","8","玖","9");return Number(numberSample[numberSample.indexOf(num)+1]); }function getWeight(wei){var weightSample=new Array("分","0.01","角","0.1","个","1","拾","10","佰","100","仟","1000","万","10000","亿","100000000");return Number(weightSample[weightSample.indexOf(wei)+1]);}

调用方法:

alert(Parse(preWork("壹万贰仟叁佰肆拾伍")));

结果:

在实际的转换过程中,输入的人民币大写金额被限制在壹亿亿一下,因为日常情况下基本达不到亿亿级别。人民币大写的金额精度只有小数点后两位,“厘”也是汉字单位,同样的在生活中很少见到(单位“厘”在利息计算中比较常见一些),所以转换前不需要考虑。

人民币大写金额转换为数字相关推荐

  1. C#数字金额转人民币大写金额的实现

    要过年了,朋友圈里充斥着各种年的味道,还有一种特别的朋友圈今年格外显眼,好像一股气流冲击着我的小心脏,2022真的是太难了. 这里,专门为各位老板写了一套数字金额转人民币大写金额的实现方法,希望大家都 ...

  2. Excel 数值转换为人民币大写金额字符串

    把$B$27单元格中的数值转换为人民币大写金额字符串: 目标单元格填入以下公式: =IF($B$27=0,CONCATENATE(IF($B$27<=0,,TEXT(INT($B$27),&qu ...

  3. C#转换人民币大写金额

    /// <summary>/// 转换人民币大写金额./// </summary>public class RMBConverter{/// <summary>// ...

  4. pandas使用read_csv读取文件数据、设置converters参数将百分比字符串转换为数字

    pandas使用read_csv读取文件数据.设置converters参数将百分比字符串转换为数字 目录 pandas使用read_csv读取文件数据.设置converters参数将百分比字符串转换为 ...

  5. Swift3.0语言教程字符串转换为数字值

    Swift3.0语言教程字符串转换为数字值 Swift3.0语言教程字符串转换为数字值,在NSString中,开发者可以将字符串转换为数字值,通过这些数字值可以实现一些功能,如加法运算.减法运算等.数 ...

  6. python 如何将数字字符串转换为数字?

    将单个数字字符串转换为数字 def char2num(s):return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7 ...

  7. C++将数字A转换为数字B所需的翻转次数算法实现(附完整源码)

    C++将数字A转换为数字B所需的翻转次数算法实现 C++将数字A转换为数字B所需的翻转次数算法实现完整源码(定义,实现,main函数测试) C++将数字A转换为数字B所需的翻转次数算法实现完整源码(定 ...

  8. c语言case怎么输入字母,如何使用switch case语句将字母转换为数字

    我正在制作黑色插口游戏,并且需要使用switch case语句将A转换为11,将T,Q,J和K转换为10,但是我不确定如何执行代码.有人会帮助我解决这个问题吗?如何使用switch case语句将字母 ...

  9. 日期格式化为yyyymmdd_Excel小技巧——如何将多行日期快速转换为数字文本

    Hello~大家好,本来计划这一期给大家介绍一下如何根据身份证号快速获得性别信息的小技巧,但是在上一节内容如何将数字快速转换成日期格式发布后,就有朋友私信问我,可不可以再介绍一下将日期快速转换成数字文 ...

  10. python字符串转化为数字-python 中判断字符串能否转换为数字类型

    方法一: isdigit() 不可识别汉字 小数类型 str1 = "1" str2 = "2.1" str3 = "三" str4 = & ...

最新文章

  1. 分享Windows Vista Beta1下载
  2. [Flash开发笔记] 关于Flash中的ASO文件
  3. keepalived-1.2.2 编译出错问题解决
  4. 机器学习降维方法总结
  5. mysql @@version_MySQL数据库安装Version5.5
  6. 深入java抽象类和接口
  7. lambda表达式pythonlist_Python 使用Lambda对list(列表)中指定格式字符串元素排序方法...
  8. 剑指offer之二叉树的高度
  9. ORACLE查询表最近更改的数据
  10. 设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)
  11. SaaS 中 6 种常见 UI 入职模式
  12. 大数据每周分享第 008 期
  13. (53)FPGA条件选择(casez)
  14. STM32 ESP8266和Java服务器透传模式下的双向通信
  15. Python 数据结构与算法——侏儒排序
  16. 剩余方差matlab,matlab 统计基本函数 var方差
  17. GitLab+Git(Git Flow分支模型)
  18. 结构化、半结构化、非结构化数据
  19. Linux解决中文乱码问题及LANG与NLS_LANG的区别
  20. 【213】《原则》Principles摘抄+读后感一--做个有原则的人

热门文章

  1. python实现傅里叶变换和反变换
  2. 计算机网络实验-----常用网络命令操作
  3. 清华计算机系人工智能学院,CoAI - 清华大学交互式人工智能课题组
  4. SpringBoot调优
  5. 单片机炫彩灯实训报告_51单片机流水灯实验报告
  6. 启动Jmeter录制代理进行录制,报 jmeter.protocol.http.proxy.ProxyControl
  7. dx11 Shaders for maya
  8. 思科Cisco Nexus 9508交换机的QSFP+端口高速线缆DAC布线方案
  9. Excel VBA-批量导出图片.vba
  10. 克隆PDB数据库操作