n2words
Version:
n2words converts a numerical number into a written one, supports 28 languages and has zero dependencies.
139 lines (127 loc) • 3.28 kB
JavaScript
import { N2WordsRU } from './ru.js';
export class N2WordsLT extends N2WordsRU {
ones = {
1: 'vienas',
2: 'du',
3: 'trys',
4: 'keturi',
5: 'penki',
6: 'šeši',
7: 'septyni',
8: 'aštuoni',
9: 'devyni'
};
onesFeminine = {
1: 'viena',
2: 'dvi',
3: 'trys',
4: 'keturios',
5: 'penkios',
6: 'šešios',
7: 'septynios',
8: 'aštuonios',
9: 'devynios'
};
tens = {
0: 'dešimt',
1: 'vienuolika',
2: 'dvylika',
3: 'trylika',
4: 'keturiolika',
5: 'penkiolika',
6: 'šešiolika',
7: 'septyniolika',
8: 'aštuoniolika',
9: 'devyniolika'
};
twenties = {
2: 'dvidešimt',
3: 'trisdešimt',
4: 'keturiasdešimt',
5: 'penkiasdešimt',
6: 'šešiasdešimt',
7: 'septyniasdešimt',
8: 'aštuoniasdešimt',
9: 'devyniasdešimt'
};
hundreds = ['šimtas', 'šimtai'];
thousands = {
1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],
2: ['milijonas', 'milijonai', 'milijonų'],
3: ['milijardas', 'milijardai', 'milijardų'],
4: ['trilijonas', 'trilijonai', 'trilijonų'],
5: ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],
6: ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],
7: ['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],
8: ['septilijonas', 'septilijonai', 'septilijonų'],
9: ['oktilijonas', 'oktilijonai', 'oktilijonų'],
10: ['naintilijonas', 'naintilijonai', 'naintilijonų'],
};
constructor(options) {
options = Object.assign({
negativeWord: 'minus',
separatorWord: 'kablelis',
zero: 'nulis'
}, options);
super(options);
}
pluralize(n, forms) {
let form = 1;
const [n1, n2] = this.getDigits(n);
if (n2 == 1 || n1 == 0 || n == 0) {
form = 2;
} else if (n1 == 1) {
form = 0;
}
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.ones[n3]);
if (n3 > 1) {
words.push(this.hundreds[1]);
} else {
words.push(this.hundreds[0]);
}
}
if (n2 > 1) {
words.push(this.twenties[n2]);
}
if (n2 == 1) {
words.push(this.tens[n1]);
} else if (n1 > 0) {
if ((index == 1 || this.feminine && index == 0) && number < 1000) {
words.push(this.onesFeminine[n1]);
} else {
words.push(this.ones[n1]);
}
}
if (index > 0) {
words.push(this.pluralize(x, this.thousands[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 N2WordsLT(options).floatToCardinal(value);
}