当前位置: 首页 > news >正文

JavaScript实现将阿拉伯数字转换成中文或大写中文

前言:现在有需求将亿元之内的阿拉伯数字转换成中文,例如:1234转换后变为一千二百三十四再转换成壹仟贰佰叁拾肆,所以本文给大家介绍了用JavaScript实现将阿拉伯数字转换成中文大写,感兴趣的小伙伴跟着小编一起来看看吧~ 💕

🌈🌈文章目录

1. 背景

2. 需求分析

2.1 数字分组

2.2 处理四位转换

2.3 循环分割数组,添加单位

2.4 大写转换

附上完整代码:

3. 总结

1. 背景

现在有需求将亿元之内的阿拉伯数字转换成中文,例如:1234转换后变为一千二百三十四再转换成壹仟贰佰叁拾肆

2. 需求分析

以下是对这些规则的分析:

  • 数字分组
  • 单位映射
  • 零的处理
  • 中文数字映射
  • 转换逻辑

2.1 数字分组

  • 将数字从低位到高位,每四位分为一组。例如,12345678 可以分为 12, 345, 678
  • 最高位可能不足四位,如 1234,则直接作为一组处理。

先看一个例子:

1234 -> 一千二百三十四

12340000 -> 一千二百三十四

规则:

  • 当是四位以内时,则是千百十表示
  • 超过四位时,则是将前几位按照 规则1表示,后面加上万的单位

通过上述可以得到,将转换的数字先进行四位拆分。

function numToWords(num) {// 四位进行分割const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean)
}

拆分情况:

123456 -> ,12,3456 -> ['',12,3456] -> [12,3456]

2.2 处理四位转换

循环拆分后的数组,每项转换,对四位进行处理。每一位对应的单位不同,转换后再进行拼接即可。

接下来处理四位转换:

  • 对于每一组数字,我们需要将其转换为对应的中文数字,并添加相应的单位。
  • 对于四位数的每一位(个、十、百、千),我们有对应的单位: ''(无单位,即个位)、
  • 对于更高位的组(万、亿等),我们也有对应的单位:亿等。

得到结果:

1234 -> 一千二百三十四

问题1: 如果是1203,得到一千二百零十三 - 需要处理如果是0 则不需要带单位

问题2: 如果1003,得到一千零零三

  • 则需要将连续的零保留一个

问题3: 如果1200 得到一千二百零零 - 需要去除末尾的零

问题4: 如果100001000 得到一亿零零零零万一千零零零 - 如果四位都是零则保留一个

const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
const units = ["", "十", "百", "千"];
function _handleZero(str) {return str.replace(/零{2,}/g, '零').replace(/零+$/, '')
}
function _transform(n) {
// 处理四位全部为0if (n === '0000') {return chars[0]}let result = ''for (let i = 0; i < n.length; i++) {// 转换汉字const c = chars[+n[i]];// 加单位 得到单位let u = units[n.length - 1 - i]// 处理0不加单位if (c === chars[0]) {u = ''}result += c + u}// 处理重复零,末尾零情况return _handleZero(result)
}

2.3 循环分割数组,添加单位

现在将四位进行分割的数组,循环遍历,添加大的单位。

  • 从低位到高位遍历数字的每一位。
  • 对于每一位,根据其在组中的位置(个、十、百、千)和组在整体数字中的位置(无单位、万、亿等),选择正确的单位和中文数字进行拼接。
  • 处理边界情况
function numToWords(num) {// 四位进行分割const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean)const bigUnits = ["", "万", "亿"];let result = ''for (let i = 0; i < numStr.length; i++) {const part = numStr[i];const c = _transform(part)let u = bigUnits[numStr.length - i - 1];// 也是需要考虑当四位为0的情况不需要添加单位if (c === chars[0]) {u = ''}result += c + u}result = _handleZero(result)return result
}

至此转换成中文就结束。

2.4 大写转换

  • 需要一个映射表,将阿拉伯数字 0-9 映射到对应的中文数字 零-九 以及大写形式 壹-玖
const map = {零: '零',一: '壹',二: '贰',三: '叁',四: '肆',五: '伍',六: '陆',七: '柒',八: '捌',九: '玖',十: '拾',百: '佰',千: '仟',万: '萬',亿: '亿',
}
// 最后结果转换下即可
result.split('').map(s => map[s]).join('')
附上完整代码:
function numToWords(num) {const map = {零: '睿',一: '壹',二: '贰',三: '叁',四: '肆',五: '伍',六: '陆',七: '柒',八: '捌',九: '玖',十: '拾',百: '佰',千: '仟',万: '萬',亿: '亿',}const bigUnits = ["", "万", "亿"];const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];const units = ["", "十", "百", "千"];// 四位进行分割const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean)let result = ''for (let i = 0; i < numStr.length; i++) {const part = numStr[i];const c = _transform(part)let u = bigUnits[numStr.length - i - 1];console.log('打印***numStr.length - i - 1', numStr.length - i - 1)if (c === chars[0]) {u = ''}result += c + uconsole.log('打印***c', c, u, part)}result = _handleZero(result)// 处理一十情况if (result === '一十') {result = '十'}return result.split('').map(s => map[s]).join('')function _handleZero(str) {return str.replace(/零{2,}/g, '零').replace(/零+$/, '')}function _transform(n) {if (n === '0000') {return chars[0]}let result = ''for (let i = 0; i < n.length; i++) {// 转换汉字const c = chars[+n[i]];// 加单位 得到单位let u = units[n.length - 1 - i]if (c === chars[0]) {u = ''}result += c + u}return _handleZero(result)}
}

3. 总结

最后总结一波:数字转换中文的核心就是将数字进行四位分组,处理边界零的情况,最后映射转换。

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家点点收藏+关注~💕 

 

    更多专栏订阅推荐:

🥕 JavaScript深入研究

👍 前端工程搭建
💕 vue从基础到起飞

✈️ HTML5与CSS3

🖼️ JavaScript基础

⭐️ uniapp与微信小程序

📝 前端工作常见问题与避坑指南

✍️ GIS地图与大数据可视化

📚 常用组件库与实用工具

💡 java入门到实战 


http://www.mrgr.cn/news/63022.html

相关文章:

  • 1.探索WebSocket:实时网络的心跳!
  • 【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)
  • ETL集成工具丨如何运用ETLCloud单步调试断点功能
  • 虚拟滚动 - 从基本实现到 Angular CDK
  • 【已解决】【hadoop】如何解决Hive连接MySQL元数据库的依赖问题
  • ChinaDX服务:快速部署,灵活调整,满足企业多样需求
  • 通过软盘拷贝文件
  • 什么是指针数组 和 数组指针
  • antd 5X中 tree属性结构,自定义菜单,右键菜单实现方式
  • 使用Nginx作为反向代理和负载均衡器
  • Linux---cp命令
  • 判断101—200之间有多少个素数,并输出所有素数
  • 芯片校正LDO电压
  • 10.31日志
  • 丢失有一段时间时的数据可以找回吗?可以!
  • 简单介绍Class文件、Dex文件以及ELF文件
  • LeetCode 热题 100 回顾27
  • spring集成kafka
  • 【Linux】掌握库的艺术:我的动静态库封装之旅
  • 【ShuQiHere】在 elementary OS 上安装 Wine 的完整指南
  • 【一些关于Python的资源】
  • windows C#-类型系统(上)
  • 向量和矩阵的范数
  • Discourse 是否支持手机注册
  • ONLYOFFICE 8.2 版本产品评测——遥遥领先
  • C++ 优先算法——盛最多水的容器(双指针)