n2words
Version:
n2words converts a numerical number into a written one, supports 28 languages and has zero dependencies.
136 lines (125 loc) • 3.96 kB
JavaScript
import BaseLanguage from '../classes/base-language.js';
export class N2WordsHU extends BaseLanguage {
constructor(options) {
options = Object.assign({
negativeWord: 'mínusz',
separatorWord: 'egész',
zero: 'nulla'
}, options);
super(options, [
[1_000_000_000_000_000_000_000_000_000n, 'quadrilliárd'],
[1_000_000_000_000_000_000_000_000n, 'quadrillió'],
[1_000_000_000_000_000_000_000n, 'trilliárd'],
[1_000_000_000_000_000_000n, 'trillió'],
[1_000_000_000_000_000n, 'billiárd'],
[1_000_000_000_000n, 'billió'],
[1_000_000_000n, 'milliárd'],
[1_000_000n, 'millió'],
[1000n, 'ezer'],
[100n, 'száz'],
[90n, 'kilencven'],
[80n, 'nyolcvan'],
[70n, 'hetven'],
[60n, 'hatvan'],
[50n, 'ötven'],
[40n, 'negyven'],
[30n, 'harminc'],
[29n, 'huszonkilenc'],
[28n, 'huszonnyolc'],
[27n, 'huszonhét'],
[26n, 'huszonhat'],
[25n, 'huszonöt'],
[24n, 'huszonnégy'],
[23n, 'huszonhárom'],
[22n, 'huszonkettő'],
[21n, 'huszonegy'],
[20n, 'húsz'],
[19n, 'tizenkilenc'],
[18n, 'tizennyolc'],
[17n, 'tizenhét'],
[16n, 'tizenhat'],
[15n, 'tizenöt'],
[14n, 'tizennégy'],
[13n, 'tizenhárom'],
[12n, 'tizenkettő'],
[11n, 'tizenegy'],
[10n, 'tíz'],
[9n, 'kilenc'],
[8n, 'nyolc'],
[7n, 'hét'],
[6n, 'hat'],
[5n, 'öt'],
[4n, 'négy'],
[3n, 'három'],
[2n, 'kettő'],
[1n, 'egy'],
[0n, 'nulla']
]);
}
tensToCardinal(number) {
if (this.getCardWord(number)) {
return this.getCardWord(number);
} else {
const tens = Math.floor(number / 10);
const units = number % 10;
return this.getCardWord(tens * 10) + this.toCardinal(units);
}
}
hundredsToCardinal(number) {
const hundreds = Math.floor(number / 100);
let prefix = 'száz';
if (hundreds != 1) {
prefix = this.toCardinal(hundreds, '') + prefix;
}
const postfix = this.toCardinal(number % 100, '');
return prefix + postfix;
}
thousandsToCardinal(number) {
const thousands = Math.floor(number / 1000);
let prefix = 'ezer';
if (thousands != 1) {
prefix = this.toCardinal(thousands, '') + prefix;
}
let postfix = this.toCardinal(number % 1000, '');
let middle = (number <= 2000 || postfix == '') ? '' : '-';
return prefix + middle + postfix;
}
bigNumberToCardinal(number) {
const numberLength = number.toString().length;
let digits = (numberLength % 3 === 0) ? numberLength - 2 : numberLength;
let exp = 10 ** (Math.floor(digits / 3) * 3);
let prefix = this.toCardinal(number / BigInt(exp), '');
let rest = this.toCardinal(number % BigInt(exp), '');
let postfix = (rest === '') ? '' : ('-' + rest);
return prefix + this.getCardWord(exp) + postfix;
}
toCardinal(number, zero = this.zero) {
let words = '';
if (number == 0n) {
words = zero;
} else if (zero == '' && number == 2) {
words = 'két';
} else if (number < 30n) {
words = this.getCardWord(Number(number));
} else if (number < 100n) {
words = this.tensToCardinal(Number(number));
} else if (number < 1000n) {
words = this.hundredsToCardinal(Number(number));
} else if (number < 1_000_000n) {
words = this.thousandsToCardinal(Number(number));
} else {
words = this.bigNumberToCardinal(number);
}
return words;
}
}
/**
* 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 N2WordsHU(options).floatToCardinal(value);
}