如何在JavaScript中将口语化数字转换为整数?
解决英文口语数字转整数的问题
为什么parseInt/Number无法解决问题
parseInt 和 Number 仅能解析由阿拉伯数字组成的字符串(比如 "5"),对英文数字单词(比如 "five")不具备识别能力,返回 NaN 是预期行为,这类方法不适合你的场景。
替代方案:实现英文数字解析逻辑
手动编写解析函数比堆砌if语句扩展性强得多,核心思路是先建立单词到数值的映射,再根据英文数字的组合规则(比如hundred对应百级、thousand对应千级)累加计算。
步骤1:建立单词-数值映射表
覆盖基础数字、整十数和常用量级词:
const wordToNumberMap = { zero: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9, ten: 10, eleven: 11, twelve: 12, thirteen: 13, fourteen: 14, fifteen: 15, sixteen: 16, seventeen: 17, eighteen: 18, nineteen: 19, twenty: 20, thirty: 30, forty: 40, fifty: 50, sixty: 60, seventy: 70, eighty: 80, ninety: 90, hundred: 100, thousand: 1000, million: 1000000 };
步骤2:编写解析函数
遍历单词数组,根据量级规则计算数值,同时忽略口语中无意义的and:
function convertSpokenNumberToInt(spokenStr) { // 预处理:转小写、分割单词、过滤"and" const words = spokenStr.toLowerCase().split(/\s+/).filter(word => word !== 'and'); let total = 0; let currentGroup = 0; // 存储当前未遇到大级别量级的数值(比如"twenty five"里的25) for (const word of words) { const num = wordToNumberMap[word]; if (num === undefined) { throw new Error(`无法识别的数字单词:${word}`); } if (num === 100) { // hundred级别:当前组数值乘以100(比如"two hundred" → 2*100=200) currentGroup *= num; } else if (num >= 1000) { // 千及以上级别:当前组数值乘量级后加到总和,重置当前组 total += currentGroup * num; currentGroup = 0; } else { // 基础数字或整十数:加到当前组 currentGroup += num; } } // 最后把剩余的当前组数值加到总和 return total + currentGroup; }
测试示例
console.log(convertSpokenNumberToInt("seven")); // 输出7 console.log(convertSpokenNumberToInt("twenty five")); // 输出25 console.log(convertSpokenNumberToInt("one hundred and twenty six")); // 输出126 console.log(convertSpokenNumberToInt("two hundred thirty five thousand")); // 输出235000
优势说明
这个方案能处理从单个数字到百万级的口语化数字,比硬编码if语句扩展性强,后续只需在映射表中补充更多量级词(比如billion)就能支持更大的数字。
内容的提问来源于stack exchange,提问作者2539901
相关产品推荐
相关产品推荐

