zoukankan      html  css  js  c++  java
  • 使用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)))
    
  • 相关阅读:
    LeetCode124 二叉树中的最大路径和
    LeetCode100 相同的树
    LeetCode206 反转链表
    LeetCode460 LFU缓存
    LeetCode876 链表的中间结点
    hdu2767 强连通分量
    hdu1827 强连通分量
    模板 tarjan算法
    hdu2227 树状数组优化dp
    割点和桥
  • 原文地址:https://www.cnblogs.com/oceans/p/13789833.html
Copyright © 2011-2022 走看看