JavaScript實(shí)現(xiàn)中文數(shù)字轉(zhuǎn)為阿拉伯?dāng)?shù)字的方法
說(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è)視頻的話,我們只需要說(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)文章
JavaScript轉(zhuǎn)換二進(jìn)制編碼為ASCII碼的方法
這篇文章主要介紹了JavaScript轉(zhuǎn)換二進(jìn)制編碼為ASCII碼的方法,涉及javascript編碼轉(zhuǎn)換的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
小程序?qū)崿F(xiàn)簡(jiǎn)單語(yǔ)音聊天的示例代碼
這篇文章主要介紹了小程序?qū)崿F(xiàn)簡(jiǎn)單語(yǔ)音聊天的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
使用BootStrapValidator完成前端輸入驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了使用BootStrapValidator來(lái)完成前端輸入驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Javascript取整函數(shù)及向零取整幾種常用的方法
這篇文章主要介紹了Javascript取整函數(shù)及向零取整幾種常用的方法,每種方法都有其特點(diǎn)和適用場(chǎng)景,推薦使用Math.trunc(),因?yàn)樗Z(yǔ)義明確、代碼易讀且性能較好,需要的朋友可以參考下2025-01-01
使用pjax實(shí)現(xiàn)無(wú)刷新更改頁(yè)面url
pjax=pushState+ajax,相信用過(guò)github的同學(xué)都知道,github部分頁(yè)面采用了pjax這個(gè)項(xiàng)目來(lái)實(shí)現(xiàn)ajax無(wú)刷新加載的同時(shí)改變頁(yè)面url。一起來(lái)學(xué)習(xí)一下這個(gè)插件吧。2015-02-02
three.js中點(diǎn)對(duì)象(Point)和點(diǎn)材質(zhì)(PointsMaterial)的具體使用
本文主要介紹了three.js中點(diǎn)對(duì)象(Point)和點(diǎn)材質(zhì)(PointsMaterial)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
js實(shí)現(xiàn)的星星評(píng)分功能函數(shù)
這篇文章主要介紹了js實(shí)現(xiàn)的星星評(píng)分功能函數(shù),涉及JavaScript響應(yīng)鼠標(biāo)事件實(shí)現(xiàn)針對(duì)頁(yè)面元素的遍歷與樣式屬性的修改技巧,非常簡(jiǎn)單實(shí)用的代碼,需要的朋友可以參考下2015-12-12

