n2words
Version:
n2words converts a numerical number into a written one, supports 28 languages and has zero dependencies.
128 lines (118 loc) • 3.21 kB
JavaScript
import { N2WordsRU } from './ru.js';
export class N2WordsSR extends N2WordsRU {
ones = {
1: ['jedan', 'jedna'],
2: ['dva', 'dve'],
3: ['tri', 'tri'],
4: ['četiri', 'četiri'],
5: ['pet', 'pet'],
6: ['šest', 'šest'],
7: ['sedam', 'sedam'],
8: ['osam', 'osam'],
9: ['devet', 'devet']
};
tens = {
0: 'deset',
1: 'jedanaest',
2: 'dvanaest',
3: 'trinaest',
4: 'četrnaest',
5: 'petnaest',
6: 'šesnaest',
7: 'sedamnaest',
8: 'osamnaest',
9: 'devetnaest'
};
twenties = {
2: 'dvadeset',
3: 'trideset',
4: 'četrdeset',
5: 'pedeset',
6: 'šezdeset',
7: 'sedamdeset',
8: 'osamdeset',
9: 'devedeset'
};
hundreds = {
1: 'sto',
2: 'dvesta',
3: 'trista',
4: 'četiristo',
5: 'petsto',
6: 'šesto',
7: 'sedamsto',
8: 'osamsto',
9: 'devetsto'
};
SCALE = [
['', '', '', false],
['hiljada', 'hiljade', 'hiljada', true], // 10 ^ 3
['milion', 'miliona', 'miliona', false], // 10 ^ 6
['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9
['bilion', 'biliona', 'biliona', false], // 10 ^ 12
['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15
['trilion', 'triliona', 'triliona', false], // 10 ^ 18
['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21
['kvadrilion', 'kvadriliona', 'kvadriliona', false], // 10 ^ 24
['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27
['kvintilion', 'kvintiliona', 'kvintiliona', false], // 10 ^ 30
];
constructor(options) {
super(Object.assign({
negativeWord: 'minus',
separatorWord: 'zapeta',
zero: 'nula'
}, options));
}
pluralize(n, forms) {
let form = 2;
if ((n % 100n < 10n) || (n % 100n > 20n)) {
if (n % 10n == 1n) {
form = 0;
} else if ((n % 10n > 1n) && (n % 10n < 5n)) {
form = 1;
}
}
return forms[form];
}
toCardinal(number) {
if (number == 0) {
return this.zero;
}
const words = [];
const chunks = this.splitByX(number.toString(), 3);
let index = chunks.length;
for (const x of chunks) {
index = index - 1;
// if (x == 0) { continue; }
const [n1, n2, n3] = this.getDigits(x);
if (n3 > 0) {
words.push(this.hundreds[n3]);
}
if (n2 > 1) {
words.push(this.twenties[n2]);
}
if (n2 == 1) {
words.push(this.tens[n1]);
} else if (n1 > 0) {
const isFeminine = (this.feminine || this.SCALE[index][3]);
const genderIndex = isFeminine ? 1 : 0;
words.push(this.ones[n1][genderIndex]);
}
if ((index > 0) && (x != 0)) {
words.push(this.pluralize(x, this.SCALE[index]));
}
}
return words.join(' ');
}
}
/**
* 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 N2WordsSR(options).floatToCardinal(value);
}