如何用JavaScript实现无分隔符数字转英文标准读法函数?
实现JavaScript数字转英文单词读法函数
需求:创建一个JavaScript函数,接收无分隔符数字(如19093),返回带标点的英文标准读法(例如Zero.、Eleven.)。
之前尝试方案的问题分析
- 正则加千分位方案:仅为数字添加千分位逗号(如
19093转成19,093),完全没有生成英文单词,不符合需求。 - Intl.NumberFormat方案:
- 参数名错误:用内置构造函数
BigInt作为参数名,会导致语法冲突; - 功能不符:
Intl.NumberFormat('en-US')默认输出带千分位的数字字符串,而非英文单词形式,无法匹配IDE预期结果。
- 参数名错误:用内置构造函数
正确实现方案
以下函数支持处理大数(通过BigInt),能将无分隔符数字转换为带句号的标准英文读法:
function sayNumber(num) { // 统一处理输入为BigInt,支持超大数字 const number = typeof num === 'string' ? BigInt(num) : BigInt(num); // 特殊处理0的情况 if (number === 0n) return 'Zero.'; // 定义基础数字单词 const ones = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen']; const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety']; const scales = ['', 'Thousand', 'Million', 'Billion', 'Trillion']; // 转换三位数为英文单词 function convertChunk(chunk) { const chunkStr = chunk.toString().padStart(3, '0'); const hundreds = parseInt(chunkStr[0], 10); const tensPart = parseInt(chunkStr.slice(1), 10); const parts = []; if (hundreds > 0) { parts.push(`${ones[hundreds]} Hundred`); } if (tensPart > 0) { if (tensPart < 20) { parts.push(ones[tensPart]); } else { const ten = Math.floor(tensPart / 10); const one = tensPart % 10; parts.push(tens[ten] + (one > 0 ? `-${ones[one]}` : '')); } } return parts.join(' '); } // 将数字拆分为三位一组的块(对应千、百万等单位) const numStr = number.toString(); const chunks = []; for (let i = numStr.length; i > 0; i -= 3) { chunks.unshift(numStr.slice(Math.max(0, i - 3), i)); } // 拼接所有块的转换结果 const resultParts = []; for (let i = 0; i < chunks.length; i++) { const chunkValue = parseInt(chunks[i], 10); if (chunkValue === 0) continue; const scale = scales[chunks.length - 1 - i]; resultParts.push(`${convertChunk(chunkValue)}${scale ? ` ${scale}` : ''}`); } return resultParts.join(' ') + '.'; }
测试用例验证
console.log(sayNumber('0')); // 输出: Zero. console.log(sayNumber('11')); // 输出: Eleven. console.log(sayNumber('19093')); // 输出: Nineteen Thousand Ninety-Three. console.log(sayNumber('1234567')); // 输出: One Million Two Hundred Thirty-Four Thousand Five Hundred Sixty-Seven. console.log(sayNumber('9876543210')); // 输出: Nine Billion Eight Hundred Seventy-Six Million Five Hundred Forty-Three Thousand Two Hundred Ten.
函数工作逻辑
- 输入处理:将输入统一转为
BigInt,避免大数精度丢失; - 特殊值处理:单独处理数字0,直接返回
Zero.; - 三位数转换:通过
convertChunk函数将每三位数字转换为对应的英文单词; - 分块处理:将数字按三位一组拆分,对应千、百万、十亿等单位;
- 结果拼接:将每个块的转换结果加上对应单位,最后拼接成完整字符串并添加句号。
内容的提问来源于stack exchange,提问作者Mark90 Bruce
相关产品推荐
相关产品推荐

