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")
- 逻辑说明:
- 拆分百位、十位 + 个位两部分
- 百位非零时拼接 "X HUNDRED"
- 十位 + 个位≥20 时拼接十位 + 个位(中间加连字符),<20 时直接使用 ones 数组值
- 百位和个位之间加 "AND" 连接
2. convertNumber(num)
- 功能:转换任意非负整数为英文大写(支持万亿级)
- 参数:num(Number)- 非负整数
- 返回值:String - 对应英文大写(如 15600 → "FIFTEEN THOUSAND SIX HUNDRED")
- 逻辑说明:
- 按每 3 位拆分数字(千分位)
- 逐段调用 convertHundreds 转换
- 拼接对应量级单位(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"
四、注意事项
- 输入格式支持:
- 支持纯数字(15600)、带小数点(1234.56)、带千位分隔符的字符串("1,234.56")
- 不支持字母、特殊字符(如 "(15600" 需先去除 ")")
- 小数处理:
- 默认保留两位小数(四舍五入),如 1.235 → 1.24
- 设 includeDecimals: false 可忽略小数部分,如 convert(1234.56, false) → "ONE THOUSAND TWO HUNDRED THIRTY FOUR ONLY"
- 地域规范:
- 百位与个位之间默认加 "AND"(符合英式英语规范),如需美式英语(不加 AND),可修改 convertHundreds 方法中 "AND" 为空格