英文金额转化

45 阅读3分钟

EnglishAmountConverter 是一个用于将数字金额(整数 / 小数)转换为英文大写格式的 JavaScript 工具类,输出格式符合财务文书规范(末尾带 ONLY),支持最大 TRILLION(万亿)级别的金额转换。

一、属性说明

属性名类型用途示例值
ones数组存储 0-19 的英文大写['', 'ONE', 'TWO', ..., 'NINETEEN']
tens数组存储 20-90 十位级别的英文大写['', '', 'TWENTY', 'THIRTY', ..., 'NINETY']
scales数组存储量级单位(千 / 百万 / 十亿 / 万亿)['', 'THOUSAND', 'MILLION', 'BILLION', 'TRILLION']

二、方法详情

class EnglishAmountConverter {
    constructor() {
        this.ones = ['', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN', 'ELEVEN', 'TWELVE', 'THIRTEEN', 'FOURTEEN', 'FIFTEEN', 'SIXTEEN', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN'];
        this.tens = ['', '', 'TWENTY', 'THIRTY', 'FORTY', 'FIFTY', 'SIXTY', 'SEVENTY', 'EIGHTY', 'NINETY'];
        this.scales = ['', 'THOUSAND', 'MILLION', 'BILLION', 'TRILLION'];
    }

    convertHundreds(num) {
        let result = '';
        const hundred = Math.floor(num / 100);
        const remainder = num % 100;
        
        if (hundred > 0) {
            result += this.ones[hundred] + ' HUNDRED';
            if (remainder > 0) {
                result += ' AND ';
            }
        }
        
        if (remainder >= 20) {
            result += this.tens[Math.floor(remainder / 10)];
            if (remainder % 10 > 0) {
                result += '-' + this.ones[remainder % 10];
            }
        } else if (remainder > 0) {
            result += this.ones[remainder];
        }
        
        return result;
    }

    convertNumber(num) {
        if (num === 0) return 'ZERO';
        
        let result = '';
        let scaleIndex = 0;
        
        while (num > 0) {
            const chunk = num % 1000;
            if (chunk > 0) {
                const chunkText = this.convertHundreds(chunk);
                if (scaleIndex > 0) {
                    result = chunkText + ' ' + this.scales[scaleIndex] + (result ? ' ' + result : '');
                } else {
                    result = chunkText;
                }
            }
            num = Math.floor(num / 1000);
            scaleIndex++;
        }
        
        return result;
    }

    convert(amount = 0, includeDecimals = true) {
        const cleanAmount = amount.toString().replace(/,/g,'');
        const num = parseFloat(cleanAmount);
        if (isNaN(num) || num < 0) {
            throw new Error('Invalid amount');
        }

        const integerPart = Math.floor(num);
        const decimalPart = Math.round((num - integerPart) * 100);
        
        let result = '';
        
        if (integerPart === 0) {
            result += 'ZERO';
        } else {
            result += this.convertNumber(integerPart);
        }
        
        if (includeDecimals && decimalPart > 0) {
            result += ' AND CENTS ' + this.convertNumber(decimalPart);
        }
        
        result += ' ONLY';
        
        return result;
    }
}

export default EnglishAmountConverter;

1. convertHundreds(num)

  • 功能:转换 0-999 之间的数字为英文大写
  • 参数:num(Number)- 0-999 的整数
  • 返回值:String - 对应英文大写(如 156 → "ONE HUNDRED AND FIFTY-SIX")
  • 逻辑说明
  1. 拆分百位、十位 + 个位两部分
  1. 百位非零时拼接 "X HUNDRED"
  1. 十位 + 个位≥20 时拼接十位 + 个位(中间加连字符),<20 时直接使用 ones 数组值
  1. 百位和个位之间加 "AND" 连接

2. convertNumber(num)

  • 功能:转换任意非负整数为英文大写(支持万亿级)
  • 参数:num(Number)- 非负整数
  • 返回值:String - 对应英文大写(如 15600 → "FIFTEEN THOUSAND SIX HUNDRED")
  • 逻辑说明
  1. 按每 3 位拆分数字(千分位)
  1. 逐段调用 convertHundreds 转换
  1. 拼接对应量级单位(THOUSAND/MILLION 等)

3. convert(amount, includeDecimals = true)

  • 功能:主方法,支持数字 / 字符串格式金额转换,可选是否包含小数部分
  • 参数
  • amount(Number/String)- 待转换金额(如 15600、"1234.56"、"15,600")
  • includeDecimals(Boolean)- 是否保留小数部分(默认 true)
  • 返回值:String - 完整英文大写金额(末尾带 "ONLY")
  • 异常:输入非数字 / 负数时抛出 Invalid amount 错误

三、使用示例

基础使用(整数金额)

import EnglishAmountConverter from './EnglishAmountConverter';
const converter = new EnglishAmountConverter();
console.log(converter.convert(15600)); 
// 输出:"FIFTEEN THOUSAND SIX HUNDRED ONLY"
console.log(converter.convert("1,234,567")); 
// 输出:"ONE MILLION TWO HUNDRED THIRTY FOUR THOUSAND FIVE HUNDRED SIXTY SEVEN ONLY"

带小数金额

console.log(converter.convert(1234.56)); 
// 输出:"ONE THOUSAND TWO HUNDRED THIRTY FOUR AND CENTS FIFTY SIX ONLY"
console.log(converter.convert(0.99, true)); 
// 输出:"ZERO AND CENTS NINETY NINE ONLY"

特殊值处理

console.log(converter.convert(0)); 
// 输出:"ZERO ONLY"
console.log(converter.convert(999999999.99)); 
// 输出:"NINE HUNDRED NINETY NINE MILLION NINE HUNDRED NINETY NINE THOUSAND NINE HUNDRED NINETY NINE AND CENTS NINETY NINE ONLY"

四、注意事项

  1. 输入格式支持
  • 支持纯数字(15600)、带小数点(1234.56)、带千位分隔符的字符串("1,234.56")
  • 不支持字母、特殊字符(如 "(15600" 需先去除 ")")
  1. 小数处理
  • 默认保留两位小数(四舍五入),如 1.235 → 1.24
  • 设 includeDecimals: false 可忽略小数部分,如 convert(1234.56, false) → "ONE THOUSAND TWO HUNDRED THIRTY FOUR ONLY"
  1. 地域规范
  • 百位与个位之间默认加 "AND"(符合英式英语规范),如需美式英语(不加 AND),可修改 convertHundreds 方法中 "AND" 为空格