Foros del Web » Programando para Internet » Javascript »

PREGUNTA CURIOSA-Convertir Número a Texto

Estas en el tema de PREGUNTA CURIOSA-Convertir Número a Texto en el foro de Javascript en Foros del Web. ... y bueno eso, el otro día me preguntaron si era posible hacer este tipo de algoritmo que se usa mucho para facturación donde el ...
  #1 (permalink)  
Antiguo 16/08/2006, 19:37
 
Fecha de Ingreso: agosto-2006
Mensajes: 44
Antigüedad: 17 años, 8 meses
Puntos: 1
PREGUNTA CURIOSA-Convertir Número a Texto

... y bueno eso, el otro día me preguntaron si era posible hacer este tipo de algoritmo que se usa mucho para facturación donde el monto total se debe escribir, yo supongo que sí, y que con JavaScript nomás se puede hacer, alguien tiene alguna idea o mejor aún... el algoritmo?

Hasta ahora solo tengo esto, algoritmo para separar por dígitos (unidades, decenas, centenas, etc.) un número.
Código:
<html>
<script>
function od(n)
{
  n=n.toString(); /*porsiaca*/
  d=n.split("");
  alert("Numero: "+n+"\nNº Dígitos: "+d.length+"\nDígitos: "+d);
}
</script>
<body>
numero: <input id="num"><input type="button" value="C" onclick="od(document.getElementById('num').value);">
</body>
</html>
Aquí d es un array donde el último elemento son las unidades y el primero es el dígito de orden más grande.

Bueno, cualquier ayuda es bienvenida.

Saludos,
HA
  #2 (permalink)  
Antiguo 17/08/2006, 09:57
Avatar de Cap.Buscapina  
Fecha de Ingreso: octubre-2004
Ubicación: Argentina
Mensajes: 836
Antigüedad: 19 años, 6 meses
Puntos: 4
con toString()


Cita:
var numero=1234.56;
texto=numero.toString();
saludos
__________________
by Capitán Buscapina
.
  #3 (permalink)  
Antiguo 17/08/2006, 19:28
 
Fecha de Ingreso: agosto-2006
Mensajes: 44
Antigüedad: 17 años, 8 meses
Puntos: 1
mmmm, no estoy tratando de convertir: 1234.56 (float) a "1234.56" (string), sino 1234.56 a mil doscientostreinta y cuatro con 56/100 centavos

Saludos,
HA
  #4 (permalink)  
Antiguo 17/08/2006, 20:42
 
Fecha de Ingreso: enero-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.047
Antigüedad: 21 años, 2 meses
Puntos: 10
hola HemeAqui... yo no tngo idea como hacerlo, pero estoy seguro que he visto como se hace eso en algun lado... No estoy seguro si era con el lenguaje javascript, creo que lo vi en el foro de PHP.... nmo se si te sirvara completamente pero por lo menos podrias obtener la logica de como hacerlo.
__________________
oohh... quisiera ser godines!!!
  #5 (permalink)  
Antiguo 19/08/2006, 16:27
Avatar de Cap.Buscapina  
Fecha de Ingreso: octubre-2004
Ubicación: Argentina
Mensajes: 836
Antigüedad: 19 años, 6 meses
Puntos: 4
holas, me quedé con la espina sobre este codigo y entonces...

Cita:
<html>
<head>
<script>
var n1=new Array("x","uno","dos","tres","cuatro","cinco","sei s","siete","ocho","nueve");
var n2=new Array("","diez","veinte","treinta","cuarenta","sin cuenta","sesenta","setenta","ochenta","noventa")
var n3=new Array("","ciento","doscientos","trescientos","cuat rocientos","quinientos","seiscientos","setecientos ","ochocientos","novecientos");
var comodin=new Array("","once","doce","trece","catorce","quince", "dieciseis","diecisiete","dieciocho","diecinueve") ;
var leyenda="";
var proximo=false;

function convertir(n){
entero=parseInt(n).toString().split("").reverse();
decimal=(parseFloat(n)-parseInt(n)).toFixed(2)*100;
for(x=6;x>0;x--){
if(eval("entero["+(x-1)+"]")){
z=(x>3)?x-3:x;
if(z==2 && eval("entero["+(x-1)+"]")==1 && eval("entero["+(x-2)+"]")>0){
proximo=true;
}else{
if(proximo){
leyenda+=eval("comodin[entero["+(x-1)+"]]")
proximo=false;
}else{
leyenda+=eval("n"+z+"[entero["+(x-1)+"]]");
}
}
leyenda+=(x==2 || x==5)?" y ":" ";
leyenda+=(x==4)?" mil ":"";
leyenda=leyenda.replace("veinte y ","veinti");
leyenda=leyenda.replace("veintix","veinte");
leyenda=leyenda.replace(" y x ","");
leyenda=leyenda.replace(" "," ");
leyenda=leyenda.replace("os y","os ");
leyenda=leyenda.replace("uno mil","un mil");
leyenda=leyenda.replace("mil y","mil");
leyenda=leyenda.replace("ciento y","ciento");
leyenda=leyenda.replace("x ","");
leyenda=leyenda.replace("ciento mil","cien mil");
leyenda=leyenda.replace(/^[y ]/,"");
}
}
leyenda+=" con "+decimal+"/100 centavos";
document.forms[0]['txt'].value=leyenda;
leyenda="";
}
</script></head>
<body>
<form>
<input type="text" name="valor" onBlur="convertir(this.value)" value="638720.678">
<textarea cols="70" rows="2" name="txt"></textarea>
</form>
</body>
</html>
restaría probarlo bien (aunque ya lo probé con un bucle hasta 999999 y parece que funciona) y fijarse si las agrupaciones de los términos es correcta (no tengo claro si es veitiunmil o veitiun mil).

cualquier bug, avisen.

saludos
__________________
by Capitán Buscapina
.
  #6 (permalink)  
Antiguo 19/08/2006, 21:04
 
Fecha de Ingreso: agosto-2006
Mensajes: 44
Antigüedad: 17 años, 8 meses
Puntos: 1
Ah caramba, te pasaste Cap.Buscapina muchas gracias.

Lo voy a probar, y a tu pregunta:
http://es.wikipedia.org/wiki/Nombres...n_espa%C3%B1ol
Nada como wikipedia para saberlo

@safe Sí he encontrado otros algoritmos que están escritos en VB, pero el de Cap.Buscapina se ve más fácil.

[EDICIÓN] Aquí el código con unas cuantas modificaciones:
Código PHP:
<html>
<
script>
var 
o=new Array("diez""once""doce""trece""catorce""quince""dieciséis""diecisiete""dieciocho""diecinueve""veinte""veintiuno""veintidós""veintitrés""veinticuatro""veinticinco""veintiséis""veintisiete""veintiocho""veintinueve");
var 
u=new Array("cero""uno""dos""tres""cuatro""cinco""seis""siete""ocho""nueve");
var 
d=new Array("""""""treinta""cuarenta""cincuenta""sesenta""sesenta""ochenta""noventa");
var 
c=new Array("""ciento""doscientos""trescientos""cuatrocientos""quinientos""seiscientos""setecientos""ochocientos""novecientos");

function 
nn(n)
{
  var 
n=parseFloat(n).toFixed(2); /*se limita a dos decimales, no sabía que existía toFixed() :)*/
  
var p=n.toString().substring(n.toString().indexOf(".")+1); /*decimales*/
  
var m=n.toString().substring(0,n.toString().indexOf(".")); /*número sin decimales*/
  
var m=parseFloat(m).toString().split("").reverse(); /*tampoco que reverse() existía :D*/
  
var t="";

  
/*OJO: no hay tercer parámetro*/
  
for (var i=0i<m.length;)
  {
    var 
x=t;
    
/*formamos un número de 2 dígitos*/
    
var b=m[i+1]!=undefined?parseFloat(m[i+1].toString()+m[i].toString()):parseFloat(m[i].toString());
    
/*analizamos y escribimos el 3 dígito primero q son las centenas*/
    
t=m[i+2]!=undefined?(c[m[i+2]]+" "):"";
    
/*escribimos los 2 primeros dígitos: decenas y unidades*/
    
t+=b<10?u[b]:(b<30?o[b-10]:(d[m[i+1]]+(m[i]=='0'?"":(" y "+u[m[i]]))));
    
/*analizamos si son 3 dígitos o menos, miles o millones*/
    
t=i<3?t:(i<6?((t=="uno"?"mil ":(t+" mil "))+x):((t=="uno"?"un millón ":(t+" millones "))+x));
    
i=i+3/*tiene que ser más 3, se analizan cada 3 dígitos*/
  
}

  
/*y agregamos los decimales*/
  
t+=" con "+p+"/100";
  
/*correcciones: siempre son necesarias*/
  
t=t.replace("  "," ");
  
t=t.replace(" cero","");
  
t=t.replace("ciento y","cien y");
  
//alert("Numero: "+n+"\nNº Dígitos: "+m.length+"\nDígitos: "+m+"\nDecimales: "+p+"\nt: "+t);
  
document.getElementById("esc").value=t;
}
</script>
<body>
numero: <input id="num"><input type="button" value="C" onclick="nn(document.getElementById('num').value);"><br>
escrito: <input style="width: 40em;" id="esc">
</body>
</html> 
  • Cubre desde 0 (cero) hasta 999999999.99 (ya quisiera ganar yo esta cantidad )
  • Como soy ocioso del diez al veintinueve están escritos tal cual

HA

Última edición por HemeAqui; 19/08/2006 a las 23:20 Razón: Código
  #7 (permalink)  
Antiguo 20/08/2006, 09:04
Avatar de Cap.Buscapina  
Fecha de Ingreso: octubre-2004
Ubicación: Argentina
Mensajes: 836
Antigüedad: 19 años, 6 meses
Puntos: 4
ejecutá este codigo (demora unos segundos ya que escribe muchas líneas) para que compruebes que tiene algunos bug (uno de ellos es que confunde setenta por sesenta y hay otros mas).

saludos
Cita:
<script>
var o=new Array("diez", "once", "doce", "trece", "catorce", "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve", "veinte", "veintiuno", "veintidós", "veintitrés", "veinticuatro", "veinticinco", "veintiséis", "veintisiete", "veintiocho", "veintinueve");
var u=new Array("cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve");
var d=new Array("", "", "", "treinta", "cuarenta", "cincuenta", "sesenta", "sesenta", "ochenta", "noventa");
var c=new Array("", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos");

function nn(n)
{
for (n=2;n<1000000;n+=892.45){
var z=parseFloat(n).toFixed(2); /*se limita a dos decimales, no sabía que existía toFixed() :)*/
var p=z.toString().substring(n.toString().indexOf(".") +1); /*decimales*/
var m=z.toString().substring(0,n.toString().indexOf(". ")); /*número sin decimales*/
var m=parseFloat(m).toString().split("").reverse(); /*tampoco que reverse() existía :D*/
var t="";

/*OJO: no hay tercer parámetro*/
for (var i=0; i<m.length;)
{
var x=t;
/*formamos un número de 2 dígitos*/
var b=m[i+1]!=undefined?parseFloat(m[i+1].toString()+m[i].toString()):parseFloat(m[i].toString());
/*analizamos y escribimos el 3 dígito primero q son las centenas*/
t=m[i+2]!=undefined?(c[m[i+2]]+" "):"";
/*escribimos los 2 primeros dígitos: decenas y unidades*/
t+=b<10?u[b]:(b<30?o[b-10]:(d[m[i+1]]+(m[i]=='0'?"":(" y "+u[m[i]]))));
/*analizamos si son 3 dígitos o menos, miles o millones*/
t=i<3?t:(i<6?((t=="uno"?"mil ":(t+" mil "))+x):((t=="uno"?"un millón ":(t+" millones "))+x));
i=i+3; /*tiene que ser más 3, se analizan cada 3 dígitos*/
}

/*y agregamos los decimales*/
t+=" con "+p+"/100";
/*correcciones: siempre son necesarias*/
t=t.replace(" "," ");
t=t.replace(" cero","");
t=t.replace("ciento y","cien y");
//alert("Numero: "+n+"\nNº Dígitos: "+m.length+"\nDígitos: "+m+"\nDecimales: "+p+"\nt: "+t);
document.body.innerHTML+=z+"......"+t+"<br>";
} }

</script>
<body onload="nn()">
</body>
</html>
__________________
by Capitán Buscapina
.
  #8 (permalink)  
Antiguo 20/08/2006, 15:56
 
Fecha de Ingreso: agosto-2006
Mensajes: 44
Antigüedad: 17 años, 8 meses
Puntos: 1
Hola, gracias por lo del sesenta , y ejecute el código .... y no terminó nunca (FF1.5)

Así que saqué el for(var i=2; i<1000000; i+=892.45) a otra función y desde esta llamé la función nn(), y bueno me parece que esta bien. Ejecuta este código. Gracias por la ayuda.
Código PHP:
<html>
<
script>
var 
o=new Array("diez""once""doce""trece""catorce""quince""dieciséis""diecisiete""dieciocho""diecinueve""veinte""veintiuno""veintidós""veintitrés""veinticuatro""veinticinco""veintiséis""veintisiete""veintiocho""veintinueve");
var 
u=new Array("cero""uno""dos""tres""cuatro""cinco""seis""siete""ocho""nueve");
var 
d=new Array("""""""treinta""cuarenta""cincuenta""sesenta""setenta""ochenta""noventa");
var 
c=new Array("""ciento""doscientos""trescientos""cuatrocientos""quinientos""seiscientos""setecientos""ochocientos""novecientos");

function 
nn(n)
{
  var 
n=parseFloat(n).toFixed(2); /*se limita a dos decimales, no sabía que existía toFixed() :)*/
  
var p=n.toString().substring(n.toString().indexOf(".")+1); /*decimales*/
  
var m=n.toString().substring(0,n.toString().indexOf(".")); /*número sin decimales*/
  
var m=parseFloat(m).toString().split("").reverse(); /*tampoco que reverse() existía :D*/
  
var t="";

  
/*Se analiza cada 3 dígitos*/
  
for (var i=0i<m.lengthi+=3)
  {
    var 
x=t;
    
/*formamos un número de 2 dígitos*/
    
var b=m[i+1]!=undefined?parseFloat(m[i+1].toString()+m[i].toString()):parseFloat(m[i].toString());
    
/*analizamos el 3 dígito*/
    
t=m[i+2]!=undefined?(c[m[i+2]]+" "):"";
    
t+=b<10?u[b]:(b<30?o[b-10]:(d[m[i+1]]+(m[i]=='0'?"":(" y "+u[m[i]]))));
    
t=i<3?t:(i<6?((t=="uno"?"mil ":(t+" mil "))+x):((t=="uno"?"un millón ":(t+" millones "))+x));
  }

  
t+=" con "+p+"/100";
  
/*correcciones*/
  
t=t.replace("  "," ");
  
t=t.replace(" cero","");
  
t=t.replace("ciento y","cien y");
  
//alert("Numero: "+n+"\nNº Dígitos: "+m.length+"\nDígitos: "+m+"\nDecimales: "+p+"\nt: "+t);
  //document.getElementById("esc").value=t;
  
return t;
}

function 
st()
{
  var 
t="<table><tr><th>número</th><th>escrito</th></tr>";
  for (var 
i=2i<1000000i+=892.45)
    
t+="<tr><td>"+i.toFixed(2)+"</td><td>"+nn(i)+"</td></tr>";
  
t+="</table>";
  
document.getElementById('out').innerHTML=t;
}
window.onload=st;
</script>
<body>
<!--numero: <input id="num"><input type="button" value="C" onclick="nn(document.getElementById('num').value);"><br>
escrito: <input style="width: 40em;" id="esc">-->
<div id="out"></div>
</body>
</html> 
HA
  #9 (permalink)  
Antiguo 20/08/2006, 16:38
Avatar de Cap.Buscapina  
Fecha de Ingreso: octubre-2004
Ubicación: Argentina
Mensajes: 836
Antigüedad: 19 años, 6 meses
Puntos: 4
ok!!!, veo que vas progresando,

Cita:
Iniciado por HemeAqui Ver Mensaje
.. y ejecute el código .... y no terminó nunca (FF1.5)
.
eso pasa por no usar Opera


fijate que todavía tiene algunos bugs:

Cita:
101741.30
ciento uno mil setecientos cuarenta y uno con 30/100
121375.20
ciento veintiuno mil trescientos setenta y cinco con 20/100
131192.15
ciento treinta y uno mil ciento noventa y dos con 15/100
saludos
__________________
by Capitán Buscapina
.
  #10 (permalink)  
Antiguo 20/08/2006, 18:48
 
Fecha de Ingreso: agosto-2006
Mensajes: 44
Antigüedad: 17 años, 8 meses
Puntos: 1
Así es, el código está mejorando.

[Fixes]
  • "y uno mil" bug fixed.
  • "ciento mil" bug fixed.
Código PHP:
<html>
<
script>
var 
o=new Array("diez""once""doce""trece""catorce""quince""dieciséis""diecisiete""dieciocho""diecinueve""veinte""veintiuno""veintidós""veintitrés""veinticuatro""veinticinco""veintiséis""veintisiete""veintiocho""veintinueve");
var 
u=new Array("cero""uno""dos""tres""cuatro""cinco""seis""siete""ocho""nueve");
var 
d=new Array("""""""treinta""cuarenta""cincuenta""sesenta""setenta""ochenta""noventa");
var 
c=new Array("""ciento""doscientos""trescientos""cuatrocientos""quinientos""seiscientos""setecientos""ochocientos""novecientos");

function 
nn(n)
{
  var 
n=parseFloat(n).toFixed(2); /*se limita a dos decimales, no sabía que existía toFixed() :)*/
  
var p=n.toString().substring(n.toString().indexOf(".")+1); /*decimales*/
  
var m=n.toString().substring(0,n.toString().indexOf(".")); /*número sin decimales*/
  
var m=parseFloat(m).toString().split("").reverse(); /*tampoco que reverse() existía :D*/
  
var t="";

  
/*Se analiza cada 3 dígitos*/
  
for (var i=0i<m.lengthi+=3)
  {
    var 
x=t;
    
/*formamos un número de 2 dígitos*/
    
var b=m[i+1]!=undefined?parseFloat(m[i+1].toString()+m[i].toString()):parseFloat(m[i].toString());
    
/*analizamos el 3 dígito*/
    
t=m[i+2]!=undefined?(c[m[i+2]]+" "):"";
    
t+=b<10?u[b]:(b<30?o[b-10]:(d[m[i+1]]+(m[i]=='0'?"":(" y "+u[m[i]]))));
    
t=t=="ciento cero"?"cien":t;
    if (
2<i&&i<6)
      
t=t=="uno"?"mil ":(t.replace("uno","un")+" mil ");
    if (
5<i&&i<9)
      
t=t=="uno"?"un millón ":(t.replace("uno","un")+" millones ");
    
t+=x;
    
//t=i<3?t:(i<6?((t=="uno"?"mil ":(t+" mil "))+x):((t=="uno"?"un millón ":(t+" millones "))+x));
  
}

  
t+=" con "+p+"/100";
  
/*correcciones*/
  
t=t.replace("  "," ");
  
t=t.replace(" cero","");
  
//t=t.replace("ciento y","cien y");
  //alert("Numero: "+n+"\nNº Dígitos: "+m.length+"\nDígitos: "+m+"\nDecimales: "+p+"\nt: "+t);
  //document.getElementById("esc").value=t;
  
return t;
}

function 
st()
{
  var 
t="<table><tr><th>número</th><th>escrito</th></tr>";
  for (var 
i=2i<1000000i+=892.45)
    
t+="<tr><td>"+i.toFixed(2)+"</td><td>"+nn(i)+"</td></tr>";
  
t+="</table>";
  
document.getElementById('out').innerHTML=t;
}
window.onload=st;
</script>
<body>
<!--numero: <input id="num"><input type="button" value="C" onclick="nn(document.getElementById('num').value);"><br>
escrito: <input style="width: 40em;" id="esc">-->
<div id="out"></div>
</body>
</html> 
HA
  #11 (permalink)  
Antiguo 22/10/2015, 08:09
 
Fecha de Ingreso: octubre-2015
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: PREGUNTA CURIOSA-Convertir Número a Texto

Como resolvieron el problema de "mil cero" cuando ponen 1000000?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 05:56.