IT加油站

原生JS实现:数字转英文单词的算法与客户端解析

26浏览 2天前 软件教程 MA123242

原文:https://dev.to/hoangvibecode/building-a-client-side-number-to-words-converter-a-lesson-in-structural-parsing-2ppk (作者 @hoangvibecode)

在软件工程、文本处理和行政工作流中,我们经常需要将原始的数值数据转换为语法正确的英文单词。这个任务在自动生成发票、创建标准化交易记录或格式化账本摘要时非常常见。

转换小数字很简单,但要解析极大的数值并处理小数,则需要一个清晰的递归分段方法。此外,在客户端执行此操作确保了敏感的后勤和交易数据永远不会离开用户的浏览器。

本文将详细介绍其算法逻辑,并展示一个清晰的原生 JavaScript 实现,该实现完全在本地处理此转换。


数值分段的算法结构

将数字转换为单词需要将标准的十进制数字序列分解为可管理的块。在英语中,数字分段遵循周期性的三位模式(个位、十位、百位),并跨后缀(千、百万、十亿等)重复。

我们的算法实现了一种滑动的分段方法。对于任何给定的输入,我们按模 1000 的块来处理数值:

Chunk = Value mod 1000

然后通过移动到下一个分段索引来更新剩余数值:

Next Value = floor(Value / 1000)

这种方法让我们能够隔离每个三位数段,使用简单的数组映射将其转换为单词,并在移动到下一个块之前附加正确的分段标识符(如“thousand”或“million”)。


客户端 JavaScript 实现

以下是处理转换的结构化、模块化的 JavaScript 函数。它通过模除法处理整数部分,同时支持可选的货币格式化或小数点表示:

/**
 * 将正整数转换为英文单词。
 * @param {number} num - 要转换的正整数
 * @returns {string} 英文单词表示
 */
function toEnglishWords(num) {
    if (num === 0) return 'zero';
    
    const ones = ['', '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'];

    let words = [];
    let scaleIdx = 0;

    while (num > 0) {
        let chunk = num % 1000;
        if (chunk > 0) {
            let chunkWords = [];
            let hundreds = Math.floor(chunk / 100);
            let remainder = chunk % 100;

            if (hundreds > 0) {
                chunkWords.push(ones[hundreds] + ' hundred');
            }

            if (remainder > 0) {
                if (remainder < 20) {
                    chunkWords.push(ones[remainder]);
                } else {
                    let tenDigit = Math.floor(remainder / 10);
                    let oneDigit = remainder % 10;
                    chunkWords.push(tens[tenDigit] + (oneDigit > 0 ? '-' + ones[oneDigit] : ''));
                }
            }

            let chunkStr = chunkWords.join(' ');
            if (scales[scaleIdx]) {
                chunkStr += ' ' + scales[scaleIdx];
            }
            words.unshift(chunkStr);
        }
        num = Math.floor(num / 1000);
        scaleIdx++;
    }

    return words.join(' ');
}


关键技术点:

小于20的数组映射:* 数字1到19在英语中有独特的命名,因此直接映射到一个扁平数组。

连字符规则:* 数字21到99之间用连字符连接(例如 twenty-five),以遵循标准的英语书写规范。

内存优化:* 解析过程完全在局部变量内管理,因此该工具可以流畅地处理大数级转换,而不会导致页面延迟。


确保用户隐私与安全

许多在线计算器会将你输入的表单数据发送到他们的服务器。当处理原始的发票数字或数据库记录时,这是一种不必要的安全风险。

通过完全在本地浏览器内存中执行字符串格式化:

无数据库日志记录:* 你的数值是临时处理的,并在字段重置时被丢弃。

轻量级性能:* 标准的 JavaScript 数组操作所需的资源极少,保持了页面的轻量加载体积。


设计一个简洁的 Web 工具

这个转换器的布局使用简单的响应式元素组织用户输入和输出字段:

  1. 交互式输入框: 一个文本区域,会自动忽略非数字字符以确保数据流的干净。
  2. 动态格式选择器: 一个可选配置,用于使用标准货币单位(如美元和美分)格式化输出。
  3. 实时输出卡片: 实时显示解析后的字符串,并带有正确的大小写格式。

如果你想寻找一个可靠的、基于浏览器的工具,将数字记录转换为正式的文本字符串,可以试试这个在线工具:

👉 在线工具: 在线数字转单词转换器


原文:https://dev.to/hoangvibecode/building-a-client-side-number-to-words-converter-a-lesson-in-structural-parsing-2ppk (作者 @hoangvibecode)

#JavaScript #前端开发 #算法