JavaScript实现中文数字转阿拉伯数字的解析逻辑与代码
作者:百宝袋时间:2026-10-31 19:56:57浏览:564
本文介绍在B站语音控制插件开发中,如何将语音识别出的中文数字(如“三百零五”、“柒億”)转换为阿拉伯数字。通过构建个位与单位映射表,结合万/亿结算逻辑与零占位处理,实现了完整的转换算法。文章提供了详细的处理流程说明及完整JavaScript代码示例,适用于需要处理中文数值字符串的技术场景。
前言
近期开发了一款B站插件,支持通过语音指令控制页面指定视频的播放。在语音识别环节,涉及将识别到的中文数字转换为阿拉伯数字的需求,本文分享该功能的具体实现案例与处理逻辑。
功能背景
首先说明功能背景。页面在渲染时会对视频进行编号,具体展示如下:

例如,若需播放第4个视频,只需发出“第4个”的语音指令,插件即可自动选中并播放对应的第四个视频。
问题描述
了解背景后,核心问题在于:

如上图所示,语音识别输出的文本包含中文数字,这与页面视频编号格式不匹配。因此,需要开发一个转换方法,将中文数字字符串解析为阿拉伯数字。
方法实现
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、处理流程
- 遇到数字字符:先暂存(例如将「三」暂记为3)
if (hasZero && current > 0) {
current *= 10;
hasZero = false;
}
current += numMap[char];
- 遇到单位:
- 如果是十/百/千:将暂存的数字乘以对应倍数(如「三百」处理为3×100=300)
current = current === 0 ? unit.value : current * unit.value;
section += current;
current = 0;
- 遇到万/亿:先结算当前累积数字,将其累加到总数中
processSection();
section = (section + current) * unit.value;
total += section;
section = 0;
遇到零:设置标记位,提示后续数字需占位(如「三百零五」解析为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; // 最终结果
let section = 0; // 当前小节
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实现中文数字转为阿拉伯数字的方法介绍完毕。如需了解更多相关技术内容,可查阅本站过往文章或继续浏览后续内容,感谢支持。
作者最新文章
定制 Quill.js 主题样式:修改默认 CSS 与添加自定义类名
2026-11-04 11:21:35
混淆JS代码怎么在线反混淆并格式化阅读
2026-11-03 21:46:39
JS在线编辑器代码报错怎么调试?控制台使用技巧
2026-11-03 21:24:56
从 marked.js 旧版本升级到最新版:API 变更与迁移指南
2026-11-03 17:38:17
JS富文本编辑器Quill与代码编辑器CodeMirror的区别及应用场景
2026-11-03 16:52:09
