n2words
Version:
n2words converts a numerical number into a written one, supports 28 languages and has zero dependencies.
126 lines (117 loc) • 3.55 kB
JavaScript
import BaseLanguage from '../classes/base-language.js';
export class N2WordsNL extends BaseLanguage {
includeOptionalAnd;
noHundredPairs;
constructor(options) {
options = Object.assign({
negativeWord: 'min',
separatorWord: 'komma',
zero: 'nul',
includeOptionalAnd: false,
noHundredPairs: false
}, options);
super(options, [
[1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],
[1_000_000_000_000_000_000_000_000n, 'quadriljoen'],
[1_000_000_000_000_000_000_000n, 'triljard'],
[1_000_000_000_000_000_000n, 'triljoen'],
[1_000_000_000_000_000n, 'biljard'],
[1_000_000_000_000n, 'biljoen'],
[1_000_000_000n, 'miljard'],
[1_000_000n, 'miljoen'],
[1000n, 'duizend'],
[100n, 'honderd'],
[90n, 'negentig'],
[80n, 'tachtig'],
[70n, 'zeventig'],
[60n, 'zestig'],
[50n, 'vijftig'],
[40n, 'veertig'],
[30n, 'dertig'],
[20n, 'twintig'],
[19n, 'negentien'],
[18n, 'achttien'],
[17n, 'zeventien'],
[16n, 'zestien'],
[15n, 'vijftien'],
[14n, 'veertien'],
[13n, 'dertien'],
[12n, 'twaalf'],
[11n, 'elf'],
[10n, 'tien'],
[9n, 'negen'],
[8n, 'acht'],
[7n, 'zeven'],
[6n, 'zes'],
[5n, 'vijf'],
[4n, 'vier'],
[3n, 'drie'],
[2n, 'twee'],
[1n, 'een'],
[0n, 'nul'],
]);
this.includeOptionalAnd = options.includeOptionalAnd;
this.noHundredPairs = options.noHundredPairs;
}
merge(current, next) {
let cText = Object.keys(current)[0];
let nText = Object.keys(next)[0];
const cNumber = BigInt(Object.values(current)[0]);
const nNumber = BigInt(Object.values(next)[0]);
if (cNumber == 1) {
if (nNumber < 1_000_000) {
return { [nText]: nNumber };
}
cText = 'een';
}
let value = 0;
if (nNumber > cNumber) {
if (nNumber >= 1_000_000) {
cText += ' ';
} else if (nNumber > 100) {
nText += ' ';
}
value = cNumber * nNumber;
} else {
if (nNumber < 10 && cNumber > 10 && cNumber < 100) {
const temporary = nText;
nText = cText;
const andTxt = temporary.endsWith('e') ? 'ën' : 'en';
cText = `${temporary}${andTxt}`;
} else if (nNumber < 13 && cNumber < 1000 && this.includeOptionalAnd) {
cText = `${cText}en`;
} else if (nNumber < 13 && cNumber >= 1000 && this.includeOptionalAnd) {
nText = ` en ${nText}`;
} else if (cNumber >= 1_000_000) {
cText += ' ';
} else {
if (cNumber == 1000) {
cText += ' ';
}
}
value = cNumber + nNumber;
}
return { [`${cText}${nText}`]: value };
}
toCardinal(value) {
if (value >= 1100n && value < 10_000n && !this.noHundredPairs) {
const high = value / 100n;
const low = value % 100n;
if (high % 10n !== 0n) {
return super.toCardinal(high) + 'honderd' +
(low ? (this.includeOptionalAnd ? ' en ' : ' ') + super.toCardinal(low) : '');
}
}
return super.toCardinal(value);
}
}
/**
* 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 N2WordsNL(options).floatToCardinal(value);
}