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è)視頻的話(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)文章
Js 時(shí)間函數(shù)getYear()的使用問(wèn)題探討
不推薦使用getYear()這個(gè)函數(shù),因?yàn)樵诨鸷酗@示是不正確的,所以推薦使用getFullYear() 函數(shù),接下來(lái)為大家詳細(xì)介紹下getYear函數(shù)在不同瀏覽下的使用問(wèn)題2013-04-04JavaScript實(shí)現(xiàn)的數(shù)字與字符串轉(zhuǎn)換功能示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的數(shù)字與字符串轉(zhuǎn)換功能,涉及javascript數(shù)字、字符串等運(yùn)算與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Javascript創(chuàng)建自定義對(duì)象 創(chuàng)建Object實(shí)例添加屬性和方法
創(chuàng)建自定義對(duì)象的最簡(jiǎn)單的方式就是創(chuàng)建一個(gè)Object實(shí)例,然后再為它添加屬性和方法2012-06-06BOM操作querySelector?querySeletorAll獲取標(biāo)簽對(duì)象
這篇文章主要為大家介紹了BOM操作querySelector?querySeletorAll獲取標(biāo)簽對(duì)象步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11微信小程序?qū)崿F(xiàn)表單驗(yàn)證提交功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)表單驗(yàn)證提交功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07js前端實(shí)現(xiàn)多圖圖片上傳預(yù)覽的兩個(gè)方法(推薦)
下面小編就為大家?guī)?lái)一篇js前端實(shí)現(xiàn)多圖圖片上傳預(yù)覽的兩個(gè)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11JavaScript 中字符串和數(shù)組的概念解析與多角度對(duì)比區(qū)分
JavaScript中的字符串和數(shù)組是兩種重要的數(shù)據(jù)結(jié)構(gòu),各有特點(diǎn)和應(yīng)用場(chǎng)景,字符串主要用于文本處理,是不可變的;數(shù)組用于存儲(chǔ)有序集合,是可變的,理解它們的區(qū)別和應(yīng)用場(chǎng)景,有助于編寫(xiě)更高效和易維護(hù)的代碼,感興趣的朋友跟隨小編一起看看吧2024-11-11