n2words
Version:
n2words converts a numerical number into a written one, supports 28 languages and has zero dependencies.
79 lines (67 loc) • 2.02 kB
JavaScript
import BaseLanguage from '../classes/base-language.js';
export class N2WordsZH extends BaseLanguage {
constructor(options) {
super(Object.assign({
negativeWord: '负',
separatorWord: '点',
zero: '零',
spaceSeparator: ''
}, options), [
[1_000_000_000_000n, '万'],
[100_000_000n, '亿'],
[10_000n, '万'],
[1000n, '仟'],
[100n, '佰'],
[10n, '拾'],
[9n, '玖'],
[8n, '捌'],
[7n, '柒'],
[6n, '陆'],
[5n, '伍'],
[4n, '肆'],
[3n, '叁'],
[2n, '贰'],
[1n, '壹'],
[0n, '零']
]);
}
merge(lPair, rPair) {
// {'one':1}, {'hundred':100}
const ltext = Object.keys(lPair)[0];
const lnum = BigInt(Object.values(lPair)[0]);
const rtext = Object.keys(rPair)[0];
const rnum = BigInt(Object.values(rPair)[0]);
let result = { [`${ltext}${rtext}`]: lnum + rnum };
if (lnum == 1 && rnum < 10) {
result = { [rtext]: rnum };
} else if (rnum > lnum) {
result = { [`${ltext}${rtext}`]: lnum * rnum };
} else if (this.zeroDigit(lnum) > this.digit(rnum)) {
result = { [`${ltext}${this.zero}${rtext}`]: lnum + rnum };
}
return result;
}
decimalToCardinal(decimal) {
const decimalPartArray = [...decimal];
const decimalPartWordsArray = decimalPartArray.map(decimal =>
this.getCardWord(decimal)
);
return decimalPartWordsArray.join(this.spaceSeparator);
}
digit(number_) {
return number_.toString().length;
}
zeroDigit(number_) {
return [...number_.toString()].filter(c => c == '0').length;
}
}
/**
* Converts a value to cardinal (written) form.
* @param {number|string|bigint} value Number to be convert.
* @param {object} [options] Options for class.
* @returns {string} Value in cardinal (written) format.
* @throws {Error} Value cannot be invalid.
*/
export default function floatToCardinal (value, options = {}) {
return new N2WordsZH(options).floatToCardinal(value);
}