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

JavaScript實(shí)現(xiàn)中文數(shù)字轉(zhuǎn)為阿拉伯?dāng)?shù)字的方法

 更新時(shí)間:2025年03月27日 10:49:57   作者:JYeontu  
在JavaScript編程中,實(shí)現(xiàn)阿拉伯?dāng)?shù)字和中文數(shù)字之間的互相轉(zhuǎn)換是一個(gè)常見(jiàn)的需求,這涉及到字符串處理和數(shù)值計(jì)算,本文將詳細(xì)介紹如何利用JavaScript實(shí)現(xiàn)這一功能,需要的朋友可以參考下

說(shuō)在前面

最近實(shí)現(xiàn)了一個(gè)b站插件,可以通過(guò)語(yǔ)音來(lái)控制播放頁(yè)面上指定的視頻,在語(yǔ)音識(shí)別的過(guò)程中遇到了需要將中文數(shù)字轉(zhuǎn)為阿拉伯?dāng)?shù)字的情況,在這里分享一下具體事例和處理過(guò)程。

功能背景

先介紹一下功能背景,頁(yè)面渲染的時(shí)候會(huì)先對(duì)視頻進(jìn)行編號(hào)處理,具體如下:

比如我們想要播放第4個(gè)視頻的話(huà),我們只需要說(shuō)“第4個(gè)”,插件就能幫我們選擇第四個(gè)視頻進(jìn)行播放。

問(wèn)題描述

功能背景我們已經(jīng)了解了,那么問(wèn)題是出在哪里呢?

如上圖,這里識(shí)別出來(lái)的語(yǔ)音文本數(shù)字是中文數(shù)字,這樣跟頁(yè)面的視頻編號(hào)無(wú)法對(duì)應(yīng)上,因此我們需要實(shí)現(xiàn)一個(gè)方法來(lái)將中文轉(zhuǎn)為阿拉伯?dāng)?shù)字。

方法實(shí)現(xiàn)

1、個(gè)位級(jí)映射表

const numMap = {
  零: 0,一: 1,壹: 1,二: 2,兩: 2,
  三: 3,叁: 3,四: 4,肆: 4,五: 5,
  伍: 5,六: 6,陸: 6,七: 7,柒: 7,
  八: 8,捌: 8,九: 9,玖: 9,
};

2、單位映射表

const unitMap = {
  十: { value: 10, sec: false },
  拾: { value: 10, sec: false },
  百: { value: 100, sec: false },
  佰: { value: 100, sec: false },
  千: { value: 1000, sec: false },
  仟: { value: 1000, sec: false },
  萬(wàn): { value: 10000, sec: true },
  萬(wàn): { value: 10000, sec: true },
  億: { value: 100000000, sec: true },
  億: { value: 100000000, sec: true }
};

3、處理流程

  • 遇到數(shù)字:先存起來(lái)(比如「三」記作3)
if (hasZero && current > 0) {
  current *= 10;
  hasZero = false;
}
current += numMap[char];
  • 遇到單位
    • 如果是十/百/千:把存著的數(shù)字乘上倍數(shù) (如「三百」→3×100=300)
current = current === 0 ? unit.value : current * unit.value;
section += current;
current = 0;
  • 遇到萬(wàn)/億:先結(jié)算當(dāng)前數(shù)字,將當(dāng)前數(shù)字加到總數(shù)上
processSection();
section = (section + current) * unit.value;
total += section;
section = 0;
  • 遇到零:做個(gè)標(biāo)記,提醒下個(gè)數(shù)字要占位 (如「三百零五」→300 + 0 +5=305)

if (char === "零") {
  hasZero = true;
  continue;
}

4、完整代碼

function chineseToArabic(chineseStr) {
  // 映射表(支持簡(jiǎn)繁)
  const numMap = {
    零: 0,一: 1,壹: 1,二: 2,兩: 2,
    三: 3,叁: 3,四: 4,肆: 4,五: 5,
    伍: 5,六: 6,陸: 6,七: 7,柒: 7,
    八: 8,捌: 8,九: 9,玖: 9,
  };
  //單位映射表
  const unitMap = {
    十: { value: 10, sec: false },
    拾: { value: 10, sec: false },
    百: { value: 100, sec: false },
    佰: { value: 100, sec: false },
    千: { value: 1000, sec: false },
    仟: { value: 1000, sec: false },
    萬(wàn): { value: 10000, sec: true },
    萬(wàn): { value: 10000, sec: true },
    億: { value: 100000000, sec: true },
    億: { value: 100000000, sec: true }
  };

  let total = 0; // 最終結(jié)果
  let section = 0; // 當(dāng)前小節(jié)
  let current = 0; // 當(dāng)前累加值
  let hasZero = false; // 零標(biāo)記

  const processSection = () => {
    section += current;
    current = 0;
  };

  for (const char of chineseStr) {
    if (numMap.hasOwnProperty(char)) {
      if (char === "零") {
        hasZero = true;
        continue;
      }

      if (hasZero && current > 0) {
        current *= 10;
        hasZero = false;
      }
      current += numMap[char];
    } else if (unitMap.hasOwnProperty(char)) {
      const unit = unitMap[char];

      if (unit.sec) {
        // 處理萬(wàn)/億分段
        processSection();
        section = (section + current) * unit.value;
        total += section;
        section = 0;
      } else {
        current = current === 0 ? unit.value : current * unit.value;
        section += current;
        current = 0;
      }
      hasZero = false;
    }
  }

  const last2 = chineseStr.slice(-2)[0];
  const last2Unit = unitMap[last2];
  if (last2Unit) {
    current = (current * last2Unit.value) / 10;
  }
  return total + section + current;
}

功能測(cè)試

柒億零捌拾萬(wàn)

十萬(wàn)三十

十萬(wàn)三

二百五

二百零五

最后

到此這篇關(guān)于JavaScript實(shí)現(xiàn)中文數(shù)字轉(zhuǎn)為阿拉伯?dāng)?shù)字的方法的文章就介紹到這了,更多相關(guān)JavaScript中文數(shù)字轉(zhuǎn)為阿拉伯?dāng)?shù)字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論