UNPKG

numbertowords

Version:

A JavaScript library to convert romanian numbers into words

307 lines (306 loc) 13.1 kB
"use strict"; var Numeral = (function () { function Numeral(numar) { this.numar = numar; //rezultat va fi un string de tip vector this.rezultat = [""]; this.ordin = 0; this._ordinP = ['', 'mii', 'milioane', 'miliarde']; this._ordinS = ['', 'mie', 'milion', 'miliard']; this._sute = ['', 'o', '', 'doua', 'trei', 'patru', 'cinci', 'sase', 'sapte', 'opt', 'noua']; this._zeci = ['', 'zece', 'douazeci', 'treizeci', 'patruzeci', 'cinzeci', 'saizeci', 'saptezeci', 'optzeci', 'nouazeci']; this._unitati = ['', 'unu', 'doi', 'trei', 'patru', 'cinci', 'sase', 'sapte', 'opt', 'noua']; this._sprezece = ['', 'unsprezece', 'doisprezece', 'treisprezece', 'paisprezece', 'cinsprezece', 'saisprezece', 'saptesprezece', 'optsprezece', 'nouasprezece']; } //metoda pentru conversia de numere cu zecimale Numeral.prototype.convertDecimal = function () { var ret = null; var value; var integer, decimal; value = this.numar.split(','); integer = new Numeral(value[0]); if (!value[1]) { ret = integer.ToWord(); } else { decimal = new Numeral(value[1]); ret = integer.ToWord() + 'virgula ' + decimal.ToWord(); } return ret; }; ; //metoda pentru convertirea monetara cu zecimale Numeral.prototype.convertMoney = function (valutaS, valutaP, baniS, baniP, virgula, punct, separator) { var ret, rezd, rezi = null; var value; var ordinsep; var r; var integer, decimal; var dec; if (+this.numar == 0) { ret = ''; } else { value = this.numar.split(virgula); if (value && value.length && value.length > 0 && value[0]) { if (punct == '.') { value[0] = value[0].replace(/\./g, ''); } else if (punct == ',') { value[0] = value[0].replace(/\,/g, ''); } integer = new Numeral(value[0]); var l = value[0].length; var u = +value[0].substr(l - 1, 1); var z = l - 2 >= 0 ? +value[0].substr(l - 2, 1) : 0; var s = l - 3 >= 0 ? +value[0].substr(l - 3, 1) : 0; rezi = integer.ToWord(separator); if (rezi) { if ((z >= 2 && u >= 0) || (s >= 0 && z == 0 && u == 0)) { rezi = rezi + 'de' + separator + valutaP; } else if (+value[0] == 1) { rezi = rezi + valutaS; } else { rezi = rezi + valutaP; } } } if (rezi && value[1]) { if (value[1].length == 1) { value[1] = value[1] + '0'; decimal = new Numeral(value[1]); if (value[1] == '10') { rezd = decimal.ToWord(separator) + baniP; } else rezd = decimal.ToWord(separator) + 'de' + separator + baniP; } else { if (value[1] == '01') { rezd = 'un' + separator + baniS; } else { decimal = new Numeral(value[1]); rezd = decimal.ToWord(separator) + baniP; if (value[1] >= '20' || value[1] >= '2') { decimal = new Numeral(value[1]); rezd = decimal.ToWord(separator) + 'de' + separator + baniP; } } } if (+value[0] == 0) { ret = rezd; } else { ret = rezi + separator + 'si' + separator + rezd; } } else { ret = rezi; } } return ret; }; ; //metoda de conversie a numerelor in cuvinte Numeral.prototype.ToWord = function (separator) { var ret = ''; var cat; var rest; //size va fi egal cu lungimea sirului var size = this.numar.length; if (size > 12) { ret = null; } else { cat = Math.floor(size / 3); rest = size % 3; //grupurile de 3 cifre if (rest == 0) { this.convert3Digits(0, size, separator); } //grupurile de 1 sau 2 cifre else { this.convert3Digits(rest, size, separator); this.convert1or2Digits(rest, separator); } //rastorn rezultatul pentru a avea ordinea corecta a grupurilor this.rezultat.reverse(); //se face concatenarea grupurilor ret = this.rezultat.join(separator); if (this.numar == '1') { ret = 'un' + separator; } } return ret; }; ; //converteste toate grupurile de 3 cifre Numeral.prototype.convert3Digits = function (length, size, separator) { var s; if (this.numar == '0001') { s = 'un'; this.rezultat.push(s); } else //extrag grupul de 3 cifre de la dreapta spre stanga parcurgand sirul for (var i = size; i > length; i = i - 3) { //determin numarul curent format din 3 cifre var curent = this.numar.substr(i - 3, 3); if (!(curent == '000') && this.ordin > 0) { s = this.convertOrdin(curent, 'o', 'doua', separator); this.rezultat.push(s); } this.ordin++; //fac conversia pentru un grup s = this.convert(+curent, separator); //rezultatul fiind un sir il voi baga intr-un vector pentru a putea face concatenarea this.rezultat.push(s); } }; ; //converteste toate grupurile de 1 sau 2 cifre Numeral.prototype.convert1or2Digits = function (rest, separator) { //rest=1 sau rest=2 var curent = this.numar.substr(0, rest); var x = ""; //fac conversia pentru un grup //rezultatul fiind un sir il voi baga intr-un vector pentru a putea face concatenarea if (this.ordin == 1) { x = this.convertOrdin(curent, 'o', 'doua', separator); } else if (this.ordin > 1) { x = this.convertOrdin(curent, 'un', 'doua', separator); } if (this.ordin == 1 && +curent == 0) { x = ''; } else if (this.ordin >= 1 && +curent >= 20) { x = this.convert(+curent, separator) + separator + 'de' + separator + this._ordinP[this.ordin]; } else if (!(this.ordin > 0 && (+curent == 1 || +curent == 2))) { x = this.convert(+curent, separator) + separator + this._ordinP[this.ordin]; } this.rezultat.push(x); }; ; // ordin mii, milioane, miliarde Numeral.prototype.convertOrdin = function (curent, one, two, separator) { var ret; var l = curent.length; var u = +curent.substr(l - 1, 1); var z = l - 2 >= 0 ? +curent.substr(l - 2, 1) : 0; var s = l - 3 >= 0 ? +curent.substr(l - 3, 1) : 0; if ((s >= 0 && z >= 2 && u >= 0) || (s > 0 && z == 0 && u == 0)) { ret = 'de' + separator + this._ordinP[this.ordin]; } else if ((s == 0) && (z == 0) && (u == 1)) { ret = one + separator + this._ordinS[this.ordin]; } else if ((s == 0) && (z == 0) && (u == 2)) { ret = two + separator + this._ordinP[this.ordin]; } else ret = this._ordinP[this.ordin]; return ret; }; ; Numeral.prototype.convert = function (valoare, separator) { var sute, zeci, unitati; if (valoare == 0) { return ""; } //determin pentru grupul de 3 cifre cel al sutelor -- cifra sutelor, zecilor si unitatilor sute = Math.floor(valoare / 100); zeci = Math.floor((valoare % 100) / 10); unitati = valoare % 10; var rezultat; //caz.1: cifra sutelor //1.1: sute=1; zeci=0; unitati=0; 100 if (sute == 1) { if ((zeci == 0) && (unitati == 0)) { rezultat = this._sute[sute] + separator + 'suta'; } //1.2. sute>=1; zeci>=1; unitati=0; 210 if ((zeci >= 1) && (unitati == 0)) { rezultat = this._sute[sute] + separator + 'suta' + separator + this._zeci[zeci]; } //1.3. sute>=1; zeci>=1; unitati>=1; 311 if ((zeci == 1) && (unitati >= 1)) { rezultat = this._sute[sute] + separator + 'suta' + separator + this._sprezece[unitati]; } //1.3. sute>=1; zeci>1; unitati>=1; 459 if ((zeci > 1) && (unitati >= 1)) { rezultat = this._sute[sute] + separator + 'suta' + separator + this._zeci[zeci] + separator + 'si' + separator + this._unitati[unitati]; } //1.4. sute>=1; zeci=0; unitati>=1 if ((zeci == 0) && (unitati > 0)) { rezultat = this._sute[sute] + separator + 'suta' + separator + this._unitati[unitati]; } } else if (sute > 1) { if ((zeci == 0) && (unitati == 0)) { rezultat = this._sute[sute + 1] + separator + 'sute'; } //1.2. sute>=1; zeci>=1; unitati=0; 210 if ((zeci >= 1) && (unitati == 0)) { rezultat = this._sute[sute + 1] + separator + 'sute' + separator + this._zeci[zeci]; } //1.3. sute>=1; zeci>=1; unitati>=1; 311 if ((zeci == 1) && (unitati >= 1)) { rezultat = this._sute[sute + 1] + separator + 'sute' + separator + this._sprezece[unitati]; } //1.3. sute>=1; zeci>1; unitati>=1; 459 if ((zeci > 1) && (unitati >= 1)) { rezultat = this._sute[sute + 1] + separator + 'sute' + separator + this._zeci[zeci] + separator + 'si' + separator + this._unitati[unitati]; } //1.4. sute>=1; zeci=0; unitati>=1 if ((zeci == 0) && (unitati > 0)) { rezultat = this._sute[sute + 1] + separator + 'sute' + separator + this._unitati[unitati]; } } //caz.2: cifra zecilor //2.1. sute=0; zeci=1; unitati=0; 10 if ((zeci >= 1) && (sute == 0) && (unitati == 0)) { rezultat = this._zeci[zeci]; } else if ((this.ordin >= 1) && (sute == 0) && (zeci > 1) && (unitati == 2)) { rezultat = this._zeci[zeci] + separator + 'si' + separator + 'doua'; } else if ((this.ordin >= 1) && (sute == 0) && (zeci > 1) && (unitati == 1 || unitati > 2)) { rezultat = this._zeci[zeci] + separator + 'si' + separator + this._unitati[unitati]; } else if ((zeci == 1) && (sute == 0) && (unitati >= 1)) { rezultat = this._sprezece[unitati]; } else if ((zeci > 1) && (sute == 0) && (unitati >= 1)) { rezultat = this._zeci[zeci] + separator + 'si' + separator + this._unitati[unitati]; } else if ((zeci > 1) && (sute == 0) && (unitati >= 1)) { rezultat = this._zeci[zeci] + separator + 'si' + separator + this._unitati[unitati]; } //caz.3. cifra unitatilor //3.1. sute>=1;zeci=0;unitati>=1; --> si unu lei if ((unitati >= 1) && (zeci == 0) && (sute == 0)) { rezultat = this._unitati[unitati]; } if ((this.ordin > 1) && (sute > 1) && (zeci == 0) && (unitati == 2)) { rezultat = this._sute[sute + 1] + separator + 'sute' + separator + 'doua'; } else if ((this.ordin > 1) && (sute > 1) && (zeci > 1) && (unitati == 2)) { rezultat = this._sute[sute + 1] + separator + 'sute' + separator + this._zeci[zeci] + separator + 'si doua'; } else if ((this.ordin > 1) && (sute == 1) && (zeci == 0) && (unitati == 2)) { rezultat = this._sute[sute] + separator + 'suta' + separator + 'doua'; } else if ((this.ordin > 1) && (sute == 1) && (zeci > 1) && (unitati == 2)) { rezultat = this._sute[sute] + separator + 'suta' + separator + this._zeci[zeci] + separator + 'si doua'; } return rezultat; }; ; return Numeral; }()); exports.Numeral = Numeral; ;