欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文或大寫中文的方法

 更新時(shí)間:2024年11月05日 11:23:23   作者:碼嘍的自我修養(yǎng)  
現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234轉(zhuǎn)換后變?yōu)橐磺Ф偃脑俎D(zhuǎn)換成壹仟貳佰叁拾肆,所以本文給大家介紹了用JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫,感興趣的小伙伴跟著小編一起來看看吧

1. 背景

現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234轉(zhuǎn)換后變?yōu)橐磺Ф偃脑俎D(zhuǎn)換成壹仟貳佰叁拾肆。

2. 需求分析

以下是對這些規(guī)則的分析:

  • 數(shù)字分組
  • 單位映射
  • 零的處理
  • 中文數(shù)字映射
  • 轉(zhuǎn)換邏輯

2.1 數(shù)字分組

  • 將數(shù)字從低位到高位,每四位分為一組。例如,12345678 可以分為 12, 345, 678。
  • 最高位可能不足四位,如 1234,則直接作為一組處理。

先看一個(gè)例子:

1234 -> 一千二百三十四

12340000 -> 一千二百三十四

規(guī)則:

  • 當(dāng)是四位以內(nèi)時(shí),則是千百十表示
  • 超過四位時(shí),則是將前幾位按照 規(guī)則1表示,后面加上萬的單位

通過上述可以得到,將轉(zhuǎn)換的數(shù)字先進(jìn)行四位拆分。

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

拆分情況:

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

2.2 處理四位轉(zhuǎn)換

循環(huán)拆分后的數(shù)組,每項(xiàng)轉(zhuǎn)換,對四位進(jìn)行處理。每一位對應(yīng)的單位不同,轉(zhuǎn)換后再進(jìn)行拼接即可。

接下來處理四位轉(zhuǎn)換:

  • 對于每一組數(shù)字,我們需要將其轉(zhuǎn)換為對應(yīng)的中文數(shù)字,并添加相應(yīng)的單位。
  • 對于四位數(shù)的每一位(個(gè)、十、百、千),我們有對應(yīng)的單位: ''(無單位,即個(gè)位)、、、。
  • 對于更高位的組(萬、億等),我們也有對應(yīng)的單位:、等。

得到結(jié)果:

1234 -> 一千二百三十四

問題1: 如果是1203,得到一千二百零十三 - 需要處理如果是0 則不需要帶單位

問題2: 如果1003,得到一千零零三

  • 則需要將連續(xù)的零保留一個(gè)

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

問題4: 如果100001000 得到一億零零零零萬一千零零零 - 如果四位都是零則保留一個(gè)

const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
const units = ["", "十", "百", "千"];
function _handleZero(str) {
    return str.replace(/零{2,}/g, '零').replace(/零+$/, '')
}
function _transform(n) {
// 處理四位全部為0
    if (n === '0000') {
        return chars[0]
    }
    let result = ''
    for (let i = 0; i < n.length; i++) {
        // 轉(zhuǎn)換漢字
        const c = chars[+n[i]];
        // 加單位 得到單位
        let u = units[n.length - 1 - i]
        // 處理0不加單位
        if (c === chars[0]) {
            u = ''
        }
        result += c + u
    }
    // 處理重復(fù)零,末尾零情況
    return _handleZero(result)
}

2.3 循環(huán)分割數(shù)組,添加單位

現(xiàn)在將四位進(jìn)行分割的數(shù)組,循環(huán)遍歷,添加大的單位。

  • 從低位到高位遍歷數(shù)字的每一位。
  • 對于每一位,根據(jù)其在組中的位置(個(gè)、十、百、千)和組在整體數(shù)字中的位置(無單位、萬、億等),選擇正確的單位和中文數(shù)字進(jìn)行拼接。
  • 處理邊界情況
function numToWords(num) {
    // 四位進(jìn)行分割
    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];
        // 也是需要考慮當(dāng)四位為0的情況不需要添加單位
        if (c === chars[0]) {
            u = ''
        }
        result += c + u
    }
    result = _handleZero(result)
    return result
}

至此轉(zhuǎn)換成中文就結(jié)束。

2.4 大寫轉(zhuǎn)換

  • 需要一個(gè)映射表,將阿拉伯?dāng)?shù)字 0-9 映射到對應(yīng)的中文數(shù)字 零-九 以及大寫形式 壹-玖。
const map = {
    零: '零',
    一: '壹',
    二: '貳',
    三: '叁',
    四: '肆',
    五: '伍',
    六: '陸',
    七: '柒',
    八: '捌',
    九: '玖',
    十: '拾',
    百: '佰',
    千: '仟',
    萬: '萬',
    億: '億',
}
// 最后結(jié)果轉(zhuǎn)換下即可
result.split('').map(s => map[s]).join('')

附上完整代碼:

function numToWords(num) {
    const map = {
        零: '睿',
        一: '壹',
        二: '貳',
        三: '叁',
        四: '肆',
        五: '伍',
        六: '陸',
        七: '柒',
        八: '捌',
        九: '玖',
        十: '拾',
        百: '佰',
        千: '仟',
        萬: '萬',
        億: '億',
    }
    const bigUnits = ["", "萬", "億"];
    const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
    const units = ["", "十", "百", "千"];
    // 四位進(jìn)行分割
    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 + u
        console.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++) {
            // 轉(zhuǎn)換漢字
            const c = chars[+n[i]];
            // 加單位 得到單位
            let u = units[n.length - 1 - i]
            if (c === chars[0]) {
                u = ''
            }
            result += c + u
        }
        return _handleZero(result)
    }
}

3. 總結(jié)

最后總結(jié)一波:數(shù)字轉(zhuǎn)換中文的核心就是將數(shù)字進(jìn)行四位分組,處理邊界零的情況,最后映射轉(zhuǎn)換。

以上就是JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文或大寫中文的方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript阿拉伯?dāng)?shù)字轉(zhuǎn)中文的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論