Números de JavaScript a palabras
Estoy intentando convertir números en palabras en inglés, por ejemplo 1234 se convertiría en: " mil doscientos treinta y cuatro ".
Mi táctica es la siguiente:
Separa los dígitos a tres y colócalos en Array (
finlOutPut
), de derecha a izquierda.Convierta cada grupo (cada celda de la
finlOutPut
matriz) de tres dígitos en una palabra (esto es lo quetriConvert
hace la función). Si los tres dígitos son cero, conviértalos a"dontAddBigSuffix"
De derecha a izquierda, suma mil, millones, mil millones, etc. Si la
finlOutPut
celda es igual"dontAddBigSufix"
(porque solo eran ceros), no agregue la palabra y establezca la celda en" "
(nada).
Parece funcionar bastante bien, pero tengo algunos problemas con números como 19000000 9 , convertidos a: " ciento noventa millones ". De alguna manera "olvida" los últimos números cuando hay algunos ceros.
¿Qué hice mal? ¿Dónde está el error? ¿Por qué no funciona perfectamente?
function update(){
var bigNumArry = new Array('', ' thousand', ' million', ' billion', ' trillion', ' quadrillion', ' quintillion');
var output = '';
var numString = document.getElementById('number').value;
var finlOutPut = new Array();
if (numString == '0') {
document.getElementById('container').innerHTML = 'Zero';
return;
}
if (numString == 0) {
document.getElementById('container').innerHTML = 'messeg tell to enter numbers';
return;
}
var i = numString.length;
i = i - 1;
//cut the number to grups of three digits and add them to the Arry
while (numString.length > 3) {
var triDig = new Array(3);
triDig[2] = numString.charAt(numString.length - 1);
triDig[1] = numString.charAt(numString.length - 2);
triDig[0] = numString.charAt(numString.length - 3);
var varToAdd = triDig[0] + triDig[1] + triDig[2];
finlOutPut.push(varToAdd);
i--;
numString = numString.substring(0, numString.length - 3);
}
finlOutPut.push(numString);
finlOutPut.reverse();
//conver each grup of three digits to english word
//if all digits are zero the triConvert
//function return the string "dontAddBigSufix"
for (j = 0; j < finlOutPut.length; j++) {
finlOutPut[j] = triConvert(parseInt(finlOutPut[j]));
}
var bigScalCntr = 0; //this int mark the million billion trillion... Arry
for (b = finlOutPut.length - 1; b >= 0; b--) {
if (finlOutPut[b] != "dontAddBigSufix") {
finlOutPut[b] = finlOutPut[b] + bigNumArry[bigScalCntr] + ' , ';
bigScalCntr++;
}
else {
//replace the string at finlOP[b] from "dontAddBigSufix" to empty String.
finlOutPut[b] = ' ';
bigScalCntr++; //advance the counter
}
}
//convert The output Arry to , more printable string
for(n = 0; n<finlOutPut.length; n++){
output +=finlOutPut[n];
}
document.getElementById('container').innerHTML = output;//print the output
}
//simple function to convert from numbers to words from 1 to 999
function triConvert(num){
var ones = new Array('', ' one', ' two', ' three', ' four', ' five', ' six', ' seven', ' eight', ' nine', ' ten', ' eleven', ' twelve', ' thirteen', ' fourteen', ' fifteen', ' sixteen', ' seventeen', ' eighteen', ' nineteen');
var tens = new Array('', '', ' twenty', ' thirty', ' forty', ' fifty', ' sixty', ' seventy', ' eighty', ' ninety');
var hundred = ' hundred';
var output = '';
var numString = num.toString();
if (num == 0) {
return 'dontAddBigSufix';
}
//the case of 10, 11, 12 ,13, .... 19
if (num < 20) {
output = ones[num];
return output;
}
//100 and more
if (numString.length == 3) {
output = ones[parseInt(numString.charAt(0))] + hundred;
output += tens[parseInt(numString.charAt(1))];
output += ones[parseInt(numString.charAt(2))];
return output;
}
output += tens[parseInt(numString.charAt(0))];
output += ones[parseInt(numString.charAt(1))];
return output;
}
<input type="text"
id="number"
size="70"
onkeyup="update();"
/*this code prevent non numeric letters*/
onkeydown="return (event.ctrlKey || event.altKey
|| (47<event.keyCode && event.keyCode<58 && event.shiftKey==false)
|| (95<event.keyCode && event.keyCode<106)
|| (event.keyCode==8) || (event.keyCode==9)
|| (event.keyCode>34 && event.keyCode<40)
|| (event.keyCode==46) )"/>
<br/>
<div id="container">Here The Numbers Printed</div>
Su problema ya está resuelto pero estoy publicando otra forma de hacerlo sólo como referencia.
El código fue escrito para ser probado en node.js, pero las funciones deberían funcionar bien cuando se llaman desde el navegador. Además, esto solo maneja el rango [0,1000000], pero se puede adaptar fácilmente para rangos más grandes.
// actual conversion code starts here
var ones = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
var tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
var teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
function convert_millions(num) {
if (num >= 1000000) {
return convert_millions(Math.floor(num / 1000000)) + " million " + convert_thousands(num % 1000000);
} else {
return convert_thousands(num);
}
}
function convert_thousands(num) {
if (num >= 1000) {
return convert_hundreds(Math.floor(num / 1000)) + " thousand " + convert_hundreds(num % 1000);
} else {
return convert_hundreds(num);
}
}
function convert_hundreds(num) {
if (num > 99) {
return ones[Math.floor(num / 100)] + " hundred " + convert_tens(num % 100);
} else {
return convert_tens(num);
}
}
function convert_tens(num) {
if (num < 10) return ones[num];
else if (num >= 10 && num < 20) return teens[num - 10];
else {
return tens[Math.floor(num / 10)] + " " + ones[num % 10];
}
}
function convert(num) {
if (num == 0) return "zero";
else return convert_millions(num);
}
//end of conversion code
//testing code begins here
function main() {
var cases = [0, 1, 2, 7, 10, 11, 12, 13, 15, 19, 20, 21, 25, 29, 30, 35, 50, 55, 69, 70, 99, 100, 101, 119, 510, 900, 1000, 5001, 5019, 5555, 10000, 11000, 100000, 199001, 1000000, 1111111, 190000009];
for (var i = 0; i < cases.length; i++) {
console.log(cases[i] + ": " + convert(cases[i]));
}
}
main();
JavaScript analiza el grupo de 3 números como un número octal cuando hay un dígito cero a la izquierda. Cuando el grupo de tres dígitos es todo ceros, el resultado es el mismo ya sea que la base sea octal o decimal.
Pero cuando le das a JavaScript '009' (o '008'), ese es un número octal no válido, por lo que obtienes cero de vuelta.
Si hubiera revisado todo el conjunto de números desde 190.000.001 hasta 190.000.010, habría visto JavaScript omitir '...,008' y '...,009' pero emitir 'ocho' para '...,010'. Ese es el '¡Eureka!' momento.
Cambiar:
for (j = 0; j < finlOutPut.length; j++) {
finlOutPut[j] = triConvert(parseInt(finlOutPut[j]));
}
a
for (j = 0; j < finlOutPut.length; j++) {
finlOutPut[j] = triConvert(parseInt(finlOutPut[j],10));
}
El código también siguió agregando comas después de cada grupo distinto de cero, así que jugué con él y encontré el lugar correcto para agregar la coma.
Viejo:
for (b = finlOutPut.length - 1; b >= 0; b--) {
if (finlOutPut[b] != "dontAddBigSufix") {
finlOutPut[b] = finlOutPut[b] + bigNumArry[bigScalCntr] + ' , ';
bigScalCntr++;
}
else {
//replace the string at finlOP[b] from "dontAddBigSufix" to empty String.
finlOutPut[b] = ' ';
bigScalCntr++; //advance the counter
}
}
//convert The output Arry to , more printable string
for(n = 0; n<finlOutPut.length; n++){
output +=finlOutPut[n];
}
Nuevo:
for (b = finlOutPut.length - 1; b >= 0; b--) {
if (finlOutPut[b] != "dontAddBigSufix") {
finlOutPut[b] = finlOutPut[b] + bigNumArry[bigScalCntr]; // <<<
bigScalCntr++;
}
else {
//replace the string at finlOP[b] from "dontAddBigSufix" to empty String.
finlOutPut[b] = ' ';
bigScalCntr++; //advance the counter
}
}
//convert The output Arry to , more printable string
var nonzero = false; // <<<
for(n = 0; n<finlOutPut.length; n++){
if (finlOutPut[n] != ' ') { // <<<
if (nonzero) output += ' , '; // <<<
nonzero = true; // <<<
} // <<<
output +=finlOutPut[n];
}
Sé que este problema se resolvió hace 3 años. Estoy publicando esto ESPECIALMENTE PARA DESARROLLADORES INDIOS
Después de pasar algún tiempo buscando en Google y jugando con otros códigos, hice una solución rápida y la función reutilizable funciona bien para números hasta 99,99,99,999. uso: number2text(1234.56);
volverá ONE THOUSAND TWO HUNDRED AND THIRTY-FOUR RUPEE AND FIFTY-SIX PAISE ONLY
. disfrutar !
function number2text(value) {
var fraction = Math.round(frac(value)*100);
var f_text = "";
if(fraction > 0) {
f_text = "AND "+convert_number(fraction)+" PAISE";
}
return convert_number(value)+" RUPEE "+f_text+" ONLY";
}
function frac(f) {
return f % 1;
}
function convert_number(number)
{
if ((number < 0) || (number > 999999999))
{
return "NUMBER OUT OF RANGE!";
}
var Gn = Math.floor(number / 10000000); /* Crore */
number -= Gn * 10000000;
var kn = Math.floor(number / 100000); /* lakhs */
number -= kn * 100000;
var Hn = Math.floor(number / 1000); /* thousand */
number -= Hn * 1000;
var Dn = Math.floor(number / 100); /* Tens (deca) */
number = number % 100; /* Ones */
var tn= Math.floor(number / 10);
var one=Math.floor(number % 10);
var res = "";
if (Gn>0)
{
res += (convert_number(Gn) + " CRORE");
}
if (kn>0)
{
res += (((res=="") ? "" : " ") +
convert_number(kn) + " LAKH");
}
if (Hn>0)
{
res += (((res=="") ? "" : " ") +
convert_number(Hn) + " THOUSAND");
}
if (Dn)
{
res += (((res=="") ? "" : " ") +
convert_number(Dn) + " HUNDRED");
}
var ones = Array("", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX","SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN","FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN","NINETEEN");
var tens = Array("", "", "TWENTY", "THIRTY", "FOURTY", "FIFTY", "SIXTY","SEVENTY", "EIGHTY", "NINETY");
if (tn>0 || one>0)
{
if (!(res==""))
{
res += " AND ";
}
if (tn < 2)
{
res += ones[tn * 10 + one];
}
else
{
res += tens[tn];
if (one>0)
{
res += ("-" + ones[one]);
}
}
}
if (res=="")
{
res = "zero";
}
return res;
}
Versión india
Versión actualizada de la respuesta de @jasonhao para la moneda india
function intToEnglish(number) {
var NS = [
{ value: 10000000, str: "Crore" },
{ value: 100000, str: "Lakh" },
{ value: 1000, str: "Thousand" },
{ value: 100, str: "Hundred" },
{ value: 90, str: "Ninety" },
{ value: 80, str: "Eighty" },
{ value: 70, str: "Seventy" },
{ value: 60, str: "Sixty" },
{ value: 50, str: "Fifty" },
{ value: 40, str: "Forty" },
{ value: 30, str: "Thirty" },
{ value: 20, str: "Twenty" },
{ value: 19, str: "Nineteen" },
{ value: 18, str: "Eighteen" },
{ value: 17, str: "Seventeen" },
{ value: 16, str: "Sixteen" },
{ value: 15, str: "Fifteen" },
{ value: 14, str: "Fourteen" },
{ value: 13, str: "Thirteen" },
{ value: 12, str: "Twelve" },
{ value: 11, str: "Eleven" },
{ value: 10, str: "Ten" },
{ value: 9, str: "Nine" },
{ value: 8, str: "Eight" },
{ value: 7, str: "Seven" },
{ value: 6, str: "Six" },
{ value: 5, str: "Five" },
{ value: 4, str: "Four" },
{ value: 3, str: "Three" },
{ value: 2, str: "Two" },
{ value: 1, str: "One" }
];
var result = '';
for (var n of NS) {
if (number >= n.value) {
if (number <= 99) {
result += n.str;
number -= n.value;
if (number > 0) result += ' ';
} else {
var t = Math.floor(number / n.value);
// console.log(t);
var d = number % n.value;
if (d > 0) {
return intToEnglish(t) + ' ' + n.str + ' ' + intToEnglish(d);
} else {
return intToEnglish(t) + ' ' + n.str;
}
}
}
}
return result;
}
console.log(intToEnglish(99))
console.log(intToEnglish(991199))
console.log(intToEnglish(123456799))
Hay una biblioteca JS para en_US y cs_CZ .
Puede usarlo de forma independiente o como módulo de Nodo.
- Números2Palabras