You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript实现无分隔符数字转英文标准读法函数?

实现JavaScript数字转英文单词读法函数

需求:创建一个JavaScript函数,接收无分隔符数字(如19093),返回带标点的英文标准读法(例如Zero.、Eleven.)。

之前尝试方案的问题分析

  • 正则加千分位方案:仅为数字添加千分位逗号(如19093转成19,093),完全没有生成英文单词,不符合需求。
  • Intl.NumberFormat方案:
    1. 参数名错误:用内置构造函数BigInt作为参数名,会导致语法冲突;
    2. 功能不符: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.

函数工作逻辑

  1. 输入处理:将输入统一转为BigInt,避免大数精度丢失;
  2. 特殊值处理:单独处理数字0,直接返回Zero.;
  3. 三位数转换:通过convertChunk函数将每三位数字转换为对应的英文单词;
  4. 分块处理:将数字按三位一组拆分,对应千、百万、十亿等单位;
  5. 结果拼接:将每个块的转换结果加上对应单位,最后拼接成完整字符串并添加句号。

内容的提问来源于stack exchange,提问作者Mark90 Bruce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:39:23