JavaScript實現(xiàn)中文數(shù)字轉(zhuǎn)為阿拉伯數(shù)字的方法
說在前面
最近實現(xiàn)了一個b站插件,可以通過語音來控制播放頁面上指定的視頻,在語音識別的過程中遇到了需要將中文數(shù)字轉(zhuǎn)為阿拉伯數(shù)字的情況,在這里分享一下具體事例和處理過程。
功能背景
先介紹一下功能背景,頁面渲染的時候會先對視頻進行編號處理,具體如下:

比如我們想要播放第4個視頻的話,我們只需要說“第4個”,插件就能幫我們選擇第四個視頻進行播放。
問題描述
功能背景我們已經(jīng)了解了,那么問題是出在哪里呢?

如上圖,這里識別出來的語音文本數(shù)字是中文數(shù)字,這樣跟頁面的視頻編號無法對應上,因此我們需要實現(xiàn)一個方法來將中文轉(zhuǎn)為阿拉伯數(shù)字。
方法實現(xiàn)
1、個位級映射表
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 },
萬: { value: 10000, sec: true },
萬: { value: 10000, sec: true },
億: { value: 100000000, sec: true },
億: { value: 100000000, sec: true }
};
3、處理流程
- 遇到數(shù)字:先存起來(比如「三」記作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;
- 遇到萬/億:先結(jié)算當前數(shù)字,將當前數(shù)字加到總數(shù)上
processSection(); section = (section + current) * unit.value; total += section; section = 0;
遇到零:做個標記,提醒下個數(shù)字要占位 (如「三百零五」→300 + 0 +5=305)
if (char === "零") {
hasZero = true;
continue;
}
4、完整代碼
function chineseToArabic(chineseStr) {
// 映射表(支持簡繁)
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 },
萬: { value: 10000, sec: true },
萬: { value: 10000, sec: true },
億: { value: 100000000, sec: true },
億: { value: 100000000, sec: true }
};
let total = 0; // 最終結(jié)果
let section = 0; // 當前小節(jié)
let current = 0; // 當前累加值
let hasZero = false; // 零標記
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) {
// 處理萬/億分段
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;
}
功能測試
柒億零捌拾萬

十萬三十

十萬三

二百五

二百零五

八

最后
到此這篇關于JavaScript實現(xiàn)中文數(shù)字轉(zhuǎn)為阿拉伯數(shù)字的方法的文章就介紹到這了,更多相關JavaScript中文數(shù)字轉(zhuǎn)為阿拉伯數(shù)字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript實現(xiàn)的數(shù)字與字符串轉(zhuǎn)換功能示例
這篇文章主要介紹了JavaScript實現(xiàn)的數(shù)字與字符串轉(zhuǎn)換功能,涉及javascript數(shù)字、字符串等運算與轉(zhuǎn)換相關操作技巧,需要的朋友可以參考下2017-08-08
Javascript創(chuàng)建自定義對象 創(chuàng)建Object實例添加屬性和方法
創(chuàng)建自定義對象的最簡單的方式就是創(chuàng)建一個Object實例,然后再為它添加屬性和方法2012-06-06
BOM操作querySelector?querySeletorAll獲取標簽對象
這篇文章主要為大家介紹了BOM操作querySelector?querySeletorAll獲取標簽對象步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
JavaScript 中字符串和數(shù)組的概念解析與多角度對比區(qū)分
JavaScript中的字符串和數(shù)組是兩種重要的數(shù)據(jù)結(jié)構(gòu),各有特點和應用場景,字符串主要用于文本處理,是不可變的;數(shù)組用于存儲有序集合,是可變的,理解它們的區(qū)別和應用場景,有助于編寫更高效和易維護的代碼,感興趣的朋友跟隨小編一起看看吧2024-11-11

