amount-to-words-multilang
Version:
Convert numbers to words in multiple languages (EN, TH, FR, JA, DE, ET, ES, FA, ZH)
116 lines (101 loc) • 5.13 kB
text/typescript
import { amountToWords } from '../src/index';
describe('Chinese (zh) Number Conversion', () => {
describe('Basic Numbers', () => {
test('should convert single digits', () => {
expect(amountToWords(0, 'zh')).toBe('零元');
expect(amountToWords(1, 'zh')).toBe('一元');
expect(amountToWords(5, 'zh')).toBe('五元');
expect(amountToWords(9, 'zh')).toBe('九元');
});
test('should convert tens', () => {
expect(amountToWords(10, 'zh')).toBe('十元');
expect(amountToWords(11, 'zh')).toBe('十一元');
expect(amountToWords(20, 'zh')).toBe('二十元');
expect(amountToWords(25, 'zh')).toBe('二十五元');
expect(amountToWords(99, 'zh')).toBe('九十九元');
});
test('should convert hundreds', () => {
expect(amountToWords(100, 'zh')).toBe('一百元');
expect(amountToWords(101, 'zh')).toBe('一百零一元');
expect(amountToWords(110, 'zh')).toBe('一百十元');
expect(amountToWords(123, 'zh')).toBe('一百二十三元');
expect(amountToWords(999, 'zh')).toBe('九百九十九元');
});
test('should convert thousands', () => {
expect(amountToWords(1000, 'zh')).toBe('一千元');
expect(amountToWords(1001, 'zh')).toBe('一千零一元');
expect(amountToWords(1010, 'zh')).toBe('一千零十元');
expect(amountToWords(1100, 'zh')).toBe('一千一百元');
expect(amountToWords(1234, 'zh')).toBe('一千二百三十四元');
});
});
describe('Ten Thousands (万)', () => {
test('should convert ten thousands', () => {
expect(amountToWords(10000, 'zh')).toBe('一万元');
expect(amountToWords(10001, 'zh')).toBe('一万零一元');
expect(amountToWords(10010, 'zh')).toBe('一万零十元');
expect(amountToWords(10100, 'zh')).toBe('一万零一百元');
expect(amountToWords(11000, 'zh')).toBe('一万一千元');
expect(amountToWords(12345, 'zh')).toBe('一万二千三百四十五元');
});
test('should convert larger numbers with 万', () => {
expect(amountToWords(100000, 'zh')).toBe('十万元');
expect(amountToWords(123456, 'zh')).toBe('十二万三千四百五十六元');
expect(amountToWords(999999, 'zh')).toBe('九十九万九千九百九十九元');
});
});
describe('Hundreds of Millions (億)', () => {
test('should convert hundreds of millions', () => {
expect(amountToWords(100000000, 'zh')).toBe('一億元');
expect(amountToWords(100000001, 'zh')).toBe('一億零一元');
expect(amountToWords(123456789, 'zh')).toBe('一億二千三百四十五万六千七百八十九元');
});
});
describe('Decimal Places (分)', () => {
test('should convert amounts with cents', () => {
expect(amountToWords(1.01, 'zh')).toBe('一元零一分');
expect(amountToWords(1.10, 'zh')).toBe('一元一十分');
expect(amountToWords(1.23, 'zh')).toBe('一元二十三分');
expect(amountToWords(0.05, 'zh')).toBe('五分');
expect(amountToWords(0.50, 'zh')).toBe('五十分');
expect(amountToWords(0.99, 'zh')).toBe('九十九分');
});
test('should handle complex amounts with decimals', () => {
expect(amountToWords(1234.56, 'zh')).toBe('一千二百三十四元五十六分');
expect(amountToWords(10000.01, 'zh')).toBe('一万元零一分');
expect(amountToWords(12345.67, 'zh')).toBe('一万二千三百四十五元六十七分');
});
});
describe('Edge Cases', () => {
test('should handle zero in different positions', () => {
expect(amountToWords(1001, 'zh')).toBe('一千零一元');
expect(amountToWords(1010, 'zh')).toBe('一千零十元');
expect(amountToWords(1100, 'zh')).toBe('一千一百元');
expect(amountToWords(10001, 'zh')).toBe('一万零一元');
expect(amountToWords(10010, 'zh')).toBe('一万零十元');
expect(amountToWords(10100, 'zh')).toBe('一万零一百元');
});
test('should handle large numbers', () => {
expect(amountToWords(999999999, 'zh')).toBe('九億九千九百九十九万九千九百九十九元');
expect(amountToWords(1000000000, 'zh')).toBe('十億元');
});
});
describe('Error handling', () => {
test('throws error for negative amounts', () => {
expect(() => amountToWords(-1, 'zh')).toThrow('金额不能是负数');
expect(() => amountToWords(-123.45, 'zh')).toThrow('金额不能是负数');
});
test('throws error for non-finite numbers', () => {
expect(() => amountToWords(Infinity, 'zh')).toThrow('金额必须是有限的数字');
expect(() => amountToWords(-Infinity, 'zh')).toThrow('金额必须是有限的数字');
expect(() => amountToWords(NaN, 'zh')).toThrow('金额必须是有限的数字');
});
});
describe('Rounding', () => {
test('should properly round cents', () => {
expect(amountToWords(1.234, 'zh')).toBe('一元二十三分');
expect(amountToWords(1.235, 'zh')).toBe('一元二十四分');
expect(amountToWords(1.999, 'zh')).toBe('二元');
});
});
});