工具方法 - 阿拉伯数字转中文小写

业务有个需求需要展示:xxx一,xxx二 这样的,搜了几个方法都有瑕疵,还是自己写一个吧:

/**
 * @Description: 阿拉伯数字转中文小写
 * @param {String, Number} num 要转化的数字
 * @return {String} 转换后的中文小写
 */
export function formatNumberToChinese(num) {
  // 1234
  const basic = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
  const unit = ['', '十', '百', '千', '万', '十万', '百万', '千万', '亿']
  const resArr = []
  const numArr = parseInt(num.toString()).toString().split('') // ['1', '2', '3', '4'] parseInt字符串可以去掉数字开头的0
  numArr.forEach((item, index) => {
    /**
     * 不需要数字的情况
     * 1、10-19之间的数,不需要[一]
     * 2、最后一位是0的不需要[零]
     */
    const nonNeedNum_1 = (numArr.length === 2 && index === 0 && +item === 1)
    const nonNeedNum_2 = (index === numArr.length - 1) && (+item === 0)
    const basicRes = (nonNeedNum_1 || nonNeedNum_2) ? '' : basic[item]
    /**
     * 不需要单位的情况
     * 1、当前数字是0,比如101,[一百零一],不需要[十]
     */
    const nonNeedUnit_1 = (+item === 0)
    const unitRes = nonNeedUnit_1 ? '' : unit[numArr.length - 1 - index]
    // 拼接数字和单位
    const curJoin = basicRes + unitRes
    /**
     * 如果结果数组的最后一位是[零]且当前也是[零],则不需要拼接
     */
    const nonNeedJoin_1 = (resArr.slice(-1)[0] === '零') && (basicRes === '零') // 兼容 不用.at(-1)
    if (!nonNeedJoin_1) {
      resArr.push(curJoin)
    }
  })
  const res = resArr.join('')
  // 如果数字不是0而最后一位是[零]就得嘎掉
  if (+num && res.substring(res.length - 1) === '零') {
    return res.substring(0, res.length - 1)
  }
  return res
}

目前是没发现有对不上的情况,如果大家发现了请在评论中指出我去修复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值