rosaenlg-n2words
Version:
Convert numbers to words, in multiple languages
118 lines (109 loc) • 3.06 kB
JavaScript
// Copyright Wael TELLAT
// SPDX-License-Identifier: MIT
import N2WordsBase from '../classes/N2WordsBase.mjs';
export default function (options) {
N2WordsBase.call(this);
this.negative_word = 'min';
this.separator_word = 'komma';
this.ZERO = 'nul';
const defaultOptions = {
includeOptionalAnd: false,
noHundredPairs: false,
};
const localOptions = Object.assign({}, defaultOptions, options);
this.cards = [
{ '1000000000000000000000000000': 'quadriljard' },
{ '1000000000000000000000000': 'quadriljoen' },
{ '1000000000000000000000': 'triljard' },
{ 1000000000000000000: 'triljoen' },
{ 1000000000000000: 'biljard' },
{ 1000000000000: 'biljoen' },
{ 1000000000: 'miljard' },
{ 1000000: 'miljoen' },
{ 1000: 'duizend' },
{ 100: 'honderd' },
{ 90: 'negentig' },
{ 80: 'tachtig' },
{ 70: 'zeventig' },
{ 60: 'zestig' },
{ 50: 'vijftig' },
{ 40: 'veertig' },
{ 30: 'dertig' },
{ 20: 'twintig' },
{ 19: 'negentien' },
{ 18: 'achtien' },
{ 17: 'zeventien' },
{ 16: 'zestien' },
{ 15: 'vijftien' },
{ 14: 'veertien' },
{ 13: 'dertien' },
{ 12: 'twaalf' },
{ 11: 'elf' },
{ 10: 'tien' },
{ 9: 'negen' },
{ 8: 'acht' },
{ 7: 'zeven' },
{ 6: 'zes' },
{ 5: 'vijf' },
{ 4: 'vier' },
{ 3: 'drie' },
{ 2: 'twee' },
{ 1: 'een' },
{ 0: 'nul' },
];
this.merge = (curr, next) => {
let ctext = Object.keys(curr)[0];
const cnum = parseInt(Object.values(curr)[0]);
let ntext = Object.keys(next)[0];
const nnum = parseInt(Object.values(next)[0]);
if (cnum == 1) {
if (nnum < 1000000) {
return { [ntext]: nnum };
}
ctext = 'een';
}
let val = 0;
if (nnum > cnum) {
if (nnum >= 1000000) {
ctext += ' ';
} else if (nnum > 100) {
ntext += ' ';
}
val = cnum * nnum;
} else {
if (nnum < 10 && cnum > 10 && cnum < 100) {
const temp = ntext;
ntext = ctext;
const andtxt = temp.endsWith('e') ? 'ën' : 'en';
ctext = `${temp}${andtxt}`;
} else if (nnum < 13 && cnum < 1000 && localOptions.includeOptionalAnd) {
ctext = `${ctext}en`;
} else if (nnum < 13 && cnum >= 1000 && localOptions.includeOptionalAnd) {
ntext = ` en ${ntext}`;
} else if (cnum >= 1000000) {
ctext += ' ';
} else {
if (cnum === 1000) {
ctext += ' ';
}
}
val = cnum + nnum;
}
return { [`${ctext}${ntext}`]: val };
};
const old_toCardinal = this.toCardinal;
this.toCardinal = (value) => {
if (value >= 1100 && value < 10000 && !localOptions.noHundredPairs) {
const high = Math.floor(value / 100);
const low = value % 100;
if (high % 10 !== 0) {
return (
old_toCardinal(high) +
'honderd' +
(low ? (localOptions.includeOptionalAnd ? ' en ' : ' ') + old_toCardinal(low) : '')
);
}
}
return old_toCardinal(value);
};
}