n2words
Version:
n2words converts a numerical number into a written one, supports 28 languages and has zero dependencies.
111 lines (104 loc) • 2.94 kB
JavaScript
import BaseLanguage from '../classes/base-language.js';
export class N2WordsDK extends BaseLanguage {
ordFlag;
constructor(options) {
options = Object.assign({
negativeWord: 'minus',
separatorWord: 'komma',
zero: 'nul',
ordFlag: false
}, options);
super(options, [
[1_000_000_000_000_000_000_000_000_000n, 'quadrillarder'],
[1_000_000_000_000_000_000_000_000n, 'quadrillioner'],
[1_000_000_000_000_000_000_000n, 'trillarder'],
[1_000_000_000_000_000_000n, 'trillioner'],
[1_000_000_000_000_000n, 'billarder'],
[1_000_000_000_000n, 'billioner'],
[1_000_000_000n, 'millarder'],
[1_000_000n, 'millioner'],
[1000n, 'tusind'],
[100n, 'hundrede'],
[90n, 'halvfems'],
[80n, 'firs'],
[70n, 'halvfjerds'],
[60n, 'treds'],
[50n, 'halvtreds'],
[40n, 'fyrre'],
[30n, 'tredive'],
[20n, 'tyve'],
[19n, 'nitten'],
[18n, 'atten'],
[17n, 'sytten'],
[16n, 'seksten'],
[15n, 'femten'],
[14n, 'fjorten'],
[13n, 'tretten'],
[12n, 'tolv'],
[11n, 'elleve'],
[10n, 'ti'],
[9n, 'ni'],
[8n, 'otte'],
[7n, 'syv'],
[6n, 'seks'],
[5n, 'fem'],
[4n, 'fire'],
[3n, 'tre'],
[2n, 'to'],
[1n, 'et'],
[0n, 'nul']
]);
this.ordFlag = options.ordFlag;
}
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]);
let value;
if (nNumber == 100 || nNumber == 1000) {
next = { [`et${nText}`]: nNumber };
}
if (cNumber == 1) {
if (nNumber < 1_000_000 || this.ordFlag) {
return next;
}
cText = 'en';
}
if (nNumber > cNumber) {
if (nNumber >= 1_000_000) {
cText += ' ';
}
value = cNumber * nNumber;
} else {
if (cNumber >= 100 && cNumber < 1000) {
cText += ' og ';
} else if (cNumber >= 1000 && cNumber <= 100_000) {
cText += 'e og ';
}
if ((nNumber < 10) && (10 < cNumber) && (cNumber < 100)) {
if (nNumber == 1) {
nText = 'en';
}
const temporary = nText;
nText = cText;
cText = temporary + 'og';
} else if (cNumber >= 1_000_000) {
cText += ' ';
}
value = cNumber + nNumber;
}
const word = cText + nText;
return { [`${word}`]: 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 N2WordsDK(options).floatToCardinal(value);
}