【小算法】实现一个将中文数字转换成阿拉伯数字的函数

4,329次阅读
没有评论

共计 1912 个字符,预计需要花费 5 分钟才能阅读完成。

前言

本文记录一个小的算法,就是中文数字转换成数字算法

实现思路一:

1、从中文数字中逐个识别数字和权位组合

2、根据权位和数字倍数对应关系,计算出每个数字和权位组合值

3、最后求和得出结果

function ChineseToNumber(chnString) {
    const CHN_CHAR_LENGTH = 1;

    const chnNumChar = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
    const chnUnitChar = [""," 十 "," 百 "," 千 "]
    const chnUnitSection = [""," 万 "," 亿 "," 万亿 "]
    const chnValuePair = [["十", 10, false], //  [0] name 中文权位名 [1] 10 的倍数值 value  [2]secUnit 是否是节权位
      ["百", 100, false],
      ["千", 1000, false],
      ["万", 10000, true],
      ["亿", 100000000, true],
    ]
          //  主要算法
      let rtn = 0;
      let section = 0;
      let number = 0;
      let secUnit = false;
      let pos = 0;
    // 中文数字转换数字,如果返回 -1,表示这是一个权位字符。function ChineseToValue(chnStr) {for (let val = 0; val = 0) // 数字还是单位
    {
        number = num;
        pos += CHN_CHAR_LENGTH;
        if (pos>= chnString.length) // 如果是最后一位数字 直接结束
        {
        section += number;
        rtn += section;
        break;
        }
    } else {let unit = ChineseToUnit(chnString.substr(pos, CHN_CHAR_LENGTH));
        // console.log("unit",unit,secUnit)
        if (secUnit) // 是节权位说明一个节已经结束
        {section = (section + number) * unit;
        rtn += section;
        section = 0;
        } else {section += (number * unit);
        }
        number = 0;
        pos += CHN_CHAR_LENGTH;
        if (pos>= chnString.length) {
        rtn += section;
        break;
        }
    }
    }

    return rtn;
}

const testPair = [[ 0,"零"],
    [1,"一"],
    [2,"二"],
    [3,"三"],
    [4,"四"],
    [5,"五"],
    [6,"六"],
    [7,"七"],
    [8,"八"],
    [9,"九"],
    [10,"一十"],
    [11,"一十一"],
    [110,"一百一十"],
    [111,"一百一十一"],
    [100,"一百"],
    [102,"一百零二"],
    [1020,"一千零二十"],
    [1001,"一千零一"],
    [1015,"一千零一十五"],
    [1000,"一千"],
    [10000,"一万"],
    [20010,"二万零一十"],
    [20001,"二万零一"],
    [100000,"一十万"],
    [1000000,"一百万"],
    [10000000,"一千万"],
    [100000000,"一亿"],
    [1000000000,"一十亿"],
    [1000001000,"一十亿零一千"],
    [1000000100,"一十亿零一百"],
    [200010,"二十万零一十"],
    [2000105,"二百万零一百零五"],
    [20001007,"二千万一千零七"],
    [2000100190,"二十亿零一十万零一百九十"],
    [1040010000,"一十亿四千零一万"],
    [200012301,"二亿零一万二千三百零一"],
    [2005010010,"二十亿零五百零一万零一十"],
    [4009060200,"四十亿零九百零六万零二百"],
    [4294967295,"四十二亿九千四百九十六万七千二百九十五"]

]

//  测试用例
function  testChineseToNumber()
{for(let i = 0; i 

实现思路二

1、将中文数字转换成阿拉伯数字

2、将中文权位转换成 10 的倍数

function transform(str) {
    const numChar = {
        '零':0,
        '一':1,
        '二':2,
        '三':3,
        '四':4,
        '五':5,
        '六':6,
        '七':7,
        '八':8,
        '九':9
    };
    const levelChar = {
        '十':10,
        '百':100,
        '千':1000,
        '万':10000,
        '亿':100000000,
    };
    let ary = Array.from(str)
    let temp = 0
    let sum = 0
    for(let i = 0; i 

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1912字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)