使用JS将数字从汉字形式转化为阿拉伯形式

题目说明

将数字从汉字形式转化为阿拉伯形式

  • 一万:10000
  • 一百一十一:111
  • 三百九十九亿八百一十三万一千八百二十:39908131820

实现

// no-log
/**
 * @param s_123 {string}
 * @returns {number}
 */
function translateChinaNum(s_123) {
  // -------------------------------------------------- 字典,甚至可以使用繁体 --------------------------------------------------
  let map = new Map()
  map.set('一', 1)
  // map.set('壹', 1) // 特殊
  map.set('二', 2)
  // map.set('两', 2) // 特殊
  map.set('三', 3)
  map.set('四', 4)
  map.set('五', 5)
  map.set('六', 6)
  map.set('七', 7)
  map.set('八', 8)
  map.set('九', 9)

  // -------------------------------------------------- 按照亿、万为分割将字符串划分为三部分 --------------------------------------------------
  let split = ''
  split = s_123.split('亿')
  let s_1_23 = split.length > 1 ? split : ['', s_123]
  let s_23 = s_1_23[1]
  let s_1 = s_1_23[0]
  split = s_23.split('万')
  let s_2_3 = split.length > 1 ? split : ['', s_23]
  let s_2 = s_2_3[0]
  let s_3 = s_2_3[1]
  let arr = [s_1, s_2, s_3]

  // -------------------------------------------------- 对各个部分处理 --------------------------------------------------
  arr = arr.map(item => {
    let result = ''
    result = item.replace('零', '')
    // [ '一百三十二', '四千五百', '三千二百一十三' ] ==>
    result = result.replace(/[一二三四五六七八九]/g, substring => {
      return map.get(substring)
    })
    // [ '1百3十2', '4千5百', '3千2百1十3' ] ==> ['0132', '4500', '3213']
    let temp
    temp = /\d(?=千)/.exec(result)
    let num1 = temp ? temp[0] : '0'
    temp = /\d(?=百)/.exec(result)
    let num2 = temp ? temp[0] : '0'
    temp = /\d?(?=十)/.exec(result)
    let num3
    if (temp === null) { // 说明没十:一百零二
      num3 = '0'
    } else if (temp[0] === '') { // 说明十被简写了:十一
      num3 = '1'
    } else { // 正常情况:一百一十一
      num3 = temp[0]
    }
    temp = /\d$/.exec(result)
    let num4 = temp ? temp[0] : '0'
    return num1 + num2 + num3 + num4
  })
  // console.log(arr)
  // 借助parseInt自动去零
  return parseInt(arr.join(''))
}

测试

// log
function formatTranslatedChinaNum(key) {
  let num = translateChinaNum(key)
  return key + ' --> ' + num
}
// 测试并输出
;['一',
  '十一',
  '一百一十一',
  '一千一百一十一',
  '一万',
  '一万一千一百一十一',
  '四千万',
  '二亿',
  '十二亿一万一千一百一十一',
  '三百九十九亿八百一十三万一千八百二十',
].forEach(chinaNum => console.log(formatTranslatedChinaNum(chinaNum)))
posted @ 2020-10-10 02:20  oceans-pro  阅读(1080)  评论(0编辑  收藏  举报