目标
将小写的金额转化为中文大写,如99.99转为“玖拾玖圆玖角玖分”
思路

  1. 阿拉伯数字有对应的中文大写,需要将其转为中文大写。
  2. 金额分为小数部分和整数部分分别处理,整数部分和小数部分转换完成后拼接在一起即完成转换
  3. 小数部分比较简单,将阿拉伯数字转为中文大写后加上对应的单位即可,如0.22,2转为贰,加上单位角,然后递归处理。
  4. 整数部分小于4位时,单位为‘仟’,‘佰’,‘拾’,但是当位数大于四位时,在原有‘仟’,‘佰’,‘拾’的基础上需要加上单位‘万’,‘亿’,‘兆’等,因此需要将整数部分按照4个数字分为一组,每组中的数字转为大写数字加上单位,而每组中需要加上对应的单位。如12345678,先分为:‘1234’,‘5678’两组,‘1234’转为‘壹仟贰佰叁拾肆’,‘5678’转为‘伍仟陆佰柒拾捌’,然后在第一组后面加上单位‘万’。
  5. 整数部分转换时需要考虑有0的情况:
    当有0时不用带上单位’仟‘,’佰‘等,如708转为’柒佰零捌’
    多个连续的0转为大写时只有一个零,如7008转为‘柒仟零捌’。
    0在一组的末尾时省略’零‘,如780转为’柒佰捌拾‘
    若一组内元素全为0,则省略组单位,’万‘,’亿‘等,如700001234转为‘柒亿零壹仟贰佰叁拾肆’。

代码

function numToChar (num) {//将数字分为两部分let parts = num.toString().split('.')let integer = parts[0]  //整数部分let decimal = parts[1]   //小数部分//记录单位let decimalUnit = ['角', '分', '厘', '毫'];let baseUnit = ['仟', '佰', '拾', ''];let upUnit = ['万', '亿', '兆'];//记录阿拉伯数字对应中文大写let nums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]//记录结果值let res = ''//处理小数部分//如果不存在小数部分if (!decimal) {res += '整'}else{//去除小数部分后面的0,如900转为9let end = decimal.length;for(let i = decimal.length - 1; i >= 0; i--){if (decimal[i] === '0') {end--;}else{break;}}decimal = decimal.substring(0, end);//若长度大于4,则输入有误if (decimal.length > 4) {alert('请确认输入金额是否正确');return}//若小数部分的长度为0,则输入值小数部分均为0if (decimal.length === 0) {res += '整'}//阿拉伯数字转为中文大写加上单位Array.from(decimal).forEach((value, index) => {if(!Number(value) === NaN) {alert('请确认输入金额是否正确')return}res += nums[value] + decimalUnit[index];})}//处理整数部分//去除整数部分前面的0,如0090转为90let index = 0;for (let i = 0; i < integer.length; i++) {if(integer[i] === '0') index = i+1;else break}integer = integer.substring(index);//整数部分只有0的情况if (!integer.length) {res = nums[0]  + '圆' + res;}else{//将整数部分按照4个元素分组//确定第一组元素的个数(第一组元素不一定是4个,如1234567分为['123', '4567'])let stLen = integer.length % 4;if(stLen === 0) stLen = 4;//确定有几组let arrLen = integer.length / 4;//用一个数组保存分组后元素let arrInterger = []//记录每一组起始值的索引let stattInd = 0;for (let i = 0; i < arrLen; i++) {let endIndex = i * 4 + stLen;arrInterger[i] = integer.substring(stattInd, endIndex);stattInd = endIndex;}//将整数部分转为中文大写加单位//记录实际组数let upLen = arrInterger.length;//记录0出现的次数let zero = 0;arrInterger.forEach((value, index) => {let temp = ''//记录每一组内元素的个数let len = value.length;//遍历每一组中的元素for (let i = 0; i < value.length; i++) {if(value[i] === '0'){zero ++}else{//若前面出现0,则加上‘零’  if (zero > 0) {temp += nums[0]}//数字转为大写加上单位temp += nums[value[i]] + baseUnit[i % 4 + 4 - len]//0的个数归零zero = 0;}}//加上组单位//若连续0的个数大于4,则不加组单位,若小于两组,则无组单位if (zero < 4 && upLen -2 - index >= 0) {temp += upUnit[upLen -2 - index];}//将转换后的中文大写替换原元素arrInterger[index] = temp;})//整数部分分组合并,并加上小数部分res = arrInterger.join('') + '圆' + res;}return res
}

小写金额转为中文大写相关推荐

  1. 小写金额变中文大写和英文方法总结

    #region 变量申明         private static readonly String cnNumber = "零壹贰叁肆伍陆柒捌玖";         priva ...

  2. js和ts两种 将 小写金额转中文大写汉字,阿拉伯数字金额格式化成中文大写汉字,数字金额转换成财务发票大写中文

    通过 npm i money2cn 安装  支持typescript 使用: import  money2cn  from 'money2cn' const nums = money2cn(23423 ...

  3. 将小写金额转换为中文大写

    CREATE FUNCTION [dbo].[f_num_chn] (@num numeric(14,2)) RETURNS varchar(100) WITH ENCRYPTION AS BEGIN ...

  4. 小写数字转大写_不得不说的Excel小技巧:设置单元格格式将小写金额转换成大写...

    大家好,我是小秋,近期一段时间比较忙,没有在今日头条上更新原创文章了.希望朋友们多多见谅,下面与大家分享一个Excel实用小技巧:如何设置单元格格式将小写金额转换成大写? 1.应用场景 在报销单.收据 ...

  5. js收据、发票等表格数据格式化,js把数字转为中文大写

    1.表格金额格式化 /*** 把金额转为发票.收据等表格能遍历显示的数据* * @param {money} Numner 金额大小* @param {max} Numner 带(角.分的位数)* 例 ...

  6. 将数字0-9转为中文大写数字

    //转为中文大写数字 var n = 230 var fraction = ["角", "分"]; var digit = ["零", &q ...

  7. C# 金额转中文大写

    今天看到一个库是把金额转中文大写,看起来很容易,所以我就自己写了 创建的项目是创建一个 dot net core 的项目,实际上这个项目可以创建为 Stand 的. 首先创建类,这个类的构造传入一个 ...

  8. 将金额转换为中文大写

    将金额转换为中文大写 思路 判断符号,0则直接返回 数字去掉点 00结尾的要加'整' 循环,从后面每次取一个数位上的值直到最前面, 若是非零则加上对应的数值和单位 若是零,判断上一个是否为零,是,则不 ...

  9. SDNUOJ 1213.金额的中文大写

    今天做了一个题,感觉网上的程序有些繁琐或者不够简明,所以打算把自己的发上来,供大家借鉴. 前几天学校的OJ坏了,刚刚修好我便看到了这个题. 1213.金额的中文大写 Time Limit: 1000 ...

最新文章

  1. 迈入幸福婚姻殿堂的星座女
  2. 用net连某台电脑c盘怎么连_关于电脑的4个冷知识,恐怕90%的人连第一个都不知道!...
  3. mysql更新一个表里的字段等于另一个表某字段的值
  4. PyTorch 实现经典模型4:GoogLeNet
  5. jsp java 分离,java与jsp页面的字符串拼接和拆分
  6. shanghai road map
  7. C++11 std::shared_ptr的std::move()移动语义底层分析
  8. 基于朴素贝叶斯的定位算法
  9. 【技巧总结】string和char[]之前的相互转换(c_str()+strcpy+stringstream.str())
  10. usb接口多少钱_3分钟搞懂USB
  11. ESP32 学习笔记(二十一)电源管理
  12. 计算机的网络位置设置,设置网络位置是设置好还是不设置好
  13. 检测华为网络设备的常用命令
  14. Ubuntu16.04 ftp服务器安装+配置
  15. ElasticSearch入门一(索引CRD和文档的CRUD)
  16. Python-pathlib 库的 Path 用法
  17. 【人机对话】对话机器人技术简介:问答系统、对话系统与聊天机器人
  18. 小米打印机显示服务器出错,关于小米笔记本连接不上网络打印机的处理方法!莫名其妙····...
  19. c刊计算机领域见刊快的期刊,想集合大家的经历,列出一些见刊较快的期刊,以供参考!...
  20. 统计学习方法_支持向量机SVM实现

热门文章

  1. 新手学Python要打好哪些基础?从软件安装到全面基础讲解,就它了
  2. Centos如何设置ip黑名单,防止被攻击
  3. ELK企业应用-ekl快速搭建-kibana
  4. 2023 最新 抖音AI换脸表情包小程序变现玩法项目
  5. JVM(2)垃圾收集器
  6. JVM 垃圾收集算法及垃圾收集器
  7. 第一章 数据仓库理论专题
  8. 借助栈将一个带头节点的单链表倒置
  9. 2021广东高考成绩排名如何查询,2021广东省地区高考成绩排名查询,广东省高考各高中成绩喜报榜单...
  10. 如何深入学习 Android Framework