Foros del Web » Programando para Internet » PHP »

Conversion de numeros a letras

Estas en el tema de Conversion de numeros a letras en el foro de PHP en Foros del Web. Hola: Necesito el codigo para convertir de numeros a letras, haber si alguien me puede ayudar. Gracias...
  #1 (permalink)  
Antiguo 04/04/2003, 13:59
 
Fecha de Ingreso: abril-2003
Ubicación: Monterrey, Nuevo Leon Mex
Mensajes: 300
Antigüedad: 21 años
Puntos: 3
Exclamación Conversion de numeros a letras

Hola:
Necesito el codigo para convertir de numeros a letras, haber si alguien me puede ayudar.

Gracias
  #2 (permalink)  
Antiguo 04/04/2003, 14:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si estas usando PHP-GTK (seguro que lo estas usando?) .. deberías saber yá que GTK solo son las extensiones para dar salida al cliente de esa operación o lógica que tienes que implementer ...

Así que priméro deberías hacer la lógica en PHP "standar" (sea programación estructurada o usando si quieres OOP) y luego usar las liberiras PHP-GTK para mostrar ese resultado ..

Como lo que preguntas es lo primero .. muevo tu mensaje al foro PHP.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 04/04/2003, 14:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Usando google:
http://aspn.activestate.com/ASPN/Mai...panish/1421292

Adaptalo a tus necesidades ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 05/04/2003, 03:51
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Hola.

He cogido un código de una página sobre Delphi (Trucomanía) y lo he "traducido" a php. Lo dejo aquí por si sirve de ayuda:
Código PHP:
<?
function letras ($num) {
$unidad = array ('un','dos','tres','cuatro','cinco','seis','siete','ocho','nueve','diez','once','doce''trece','catorce','quince');
$decena = array ('dieci','veinti','treinta','cuarenta','cincuenta','sesenta','setenta','ochenta','noventa');
$centena = array ('ciento','doscientos','trescientos','cuatrocientos','quinientos','seiscientos','setecientos','ochocientos','novecientos');
    
$linea "";
    
$cen = (int) ($num 100);
  
$doble $num - ($cen*100);
  
$dec = (int)($num 10) - ($cen*10);
  
$uni $num - ($dec*10) - ($cen*100);
    if (
$cen 0$linea $centena[$cen-1].' ';
    if (
$doble>0) {
        if (
$doble == 20$linea .= " veinte";
        else {
            if (
$doble 16 $linea .= $unidad[$doble-1];
            else {
                
$linea .=' '$decena[$dec-1];
        if (
$dec>and $uni<>0$linea .=' y ';
        if (
$uni>0$linea.=$unidad[$uni-1];

            }
        }
    }
    return 
$linea;
}
echo 
letras (972);
?>
Saludos,
  #5 (permalink)  
Antiguo 05/04/2003, 05:57
Avatar de cofyman  
Fecha de Ingreso: noviembre-2002
Ubicación: Murcia - Spain
Mensajes: 17
Antigüedad: 21 años, 5 meses
Puntos: 0
De acuerdo Esta funcion te puede servir hasta 999

Muy buena esa tradución JavierB , aunque con algunos fallos, esta es la misma funcion pero creo haberlos corregido.
Espero que sirva, aunque solo llega hasta el 999 si alguien se anima que la continue

Código PHP:
function letras ($num) {
    
$unidad = array  ('un','dos','tres','cuatro','cinco','seis','siete','ocho','nueve');
    
$decenas = array ('diez','once','doce''trece','catorce','quince');
    
$decena = array  ('dieci','veinti','treinta','cuarenta','cincuenta','sesenta','setenta','ochenta','noventa');
    
$centena = array  ('ciento','doscientos','trescientos','cuatrocientos','quinientos','seiscientos','setecientos','ochocientos','novecientos');

    
$linea "";
    
$cen = (int) ($num 100);              //Cifra de las centenas
    
$doble $num - ($cen*100);             //Cifras de las decenas y unidades
    
$dec = (int)($num 10) - ($cen*10);    //Cifra de laa decenas
    
$uni $num - ($dec*10) - ($cen*100);   //Cifra de las unidades
    
if ($cen 0) {
        if (
$num == 100$linea "cien";
        else 
$linea $centena[$cen-1].' ';
    }
//end if
    
if ($doble>0) {
        if (
$doble == 20) {
            
$linea .= " veinte";
        }elseif ((
$doble 16) and ($doble>9)) {
            
$linea .= $decenas[$doble-10];
        }else {
            
$linea .=' '$decena[$dec-1];
        }
//end if
        
if ($dec>and $uni<>0$linea .=' y ';
        if ((
$uni>0) and ($doble>15) or ($dec==0)) {
            if (
$uni == 1$linea.="uno";
            else 
$linea.=$unidad[$uni-1];
        }
     }
return 
$linea;
}
//end function letras 
  #6 (permalink)  
Antiguo 05/04/2003, 11:16
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Hola, cofyman.

Me alegro de que te haya gustado.

Lo de que el número 100 lo ponga como "ciento" ciertamente es un error. Cuando tenga un rato probaré la función original en Delphi, porque debe estár mal también.

Lo que no he entendido es esta parte que pones:
Código PHP:
}elseif (($doble 16) and ($doble>9)) {
            
$linea .= $decenas[$doble-10]; 
Sobre la línea: if ($uni == 1) $linea.="uno";

Entiendo que es para que aparezca "uno" en lugar de "un" que no suena nada bien. Pero creo que podría solucionarse modificando el array $unidad:

$unidad = array ('uno','dos'...

Bueno, a ver si entre todos sale algo bueno de esto. Saludos,
  #7 (permalink)  
Antiguo 05/04/2003, 12:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mm Vieron y probaron el código del link que puse?

Llega hasta centenes de millon y tiene encuenta centimos tambien (ideal para Euros xD)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 05/04/2003, 12:31
 
Fecha de Ingreso: abril-2003
Ubicación: Monterrey, Nuevo Leon Mex
Mensajes: 300
Antigüedad: 21 años
Puntos: 3
Ya resolvi el problema de la conversion de numeros a letras

Gracias ya resolvi mi problema de la conversion de numeros a letras si alguien le puede servir esta a su disposicion
gracias de nuevo
  #9 (permalink)  
Antiguo 05/04/2003, 12:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues si lo pones en algun URL para que el que guste se lo baje y lo pruebe sería lo ideal .. (y si no es mucho . pegalo aqui mismo ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 05/04/2003, 15:32
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Bueno, no se como lo hayas resuelto, pero me puse a trabajar un rato en el codigo y salio esto, que segun mis pruebas funciona MUY BIEN!!

Código PHP:
<?

function numerotexto ($numero) {
    
// Primero tomamos el numero y le quitamos los caracteres especiales y extras
    // Dejando solamente el punto "." que separa los decimales
    // Si encuentra mas de un punto, devuelve error.
    // NOTA: Para los paises en que el punto y la coma se usan de forma
    // inversa, solo hay que cambiar la coma por punto en el array de "extras"
    // y el punto por coma en el explode de $partes
    
    
$extras= array("/[\$]/","/ /","/,/","/-/");
    
$limpio=preg_replace($extras,"",$numero);
    
$partes=explode(".",$limpio);
    if (
count($partes)>2) {
        return 
"Error, el n&uacute;mero no es correcto";
        exit();
    }
    
    
// Ahora explotamos la parte del numero en elementos de un array que
    // llamaremos $digitos, y contamos los grupos de tres digitos
    // resultantes
    
    
$digitos_piezas=chunk_split ($partes[0],1,"#");
    
$digitos_piezas=substr($digitos_piezas,0,strlen($digitos_piezas)-1);
    
$digitos=explode("#",$digitos_piezas);
    
$todos=count($digitos);
    
$grupos=ceil (count($digitos)/3);
    
    
// comenzamos a dar formato a cada grupo
    
    
$unidad = array   ('un','dos','tres','cuatro','cinco','seis','siete','ocho','nueve');
    
$decenas = array ('diez','once','doce''trece','catorce','quince');
    
$decena = array   ('dieci','veinti','treinta','cuarenta','cincuenta','sesenta','setenta','ochenta','noventa');
    
$centena = array   ('ciento','doscientos','trescientos','cuatrocientos','quinientos','seiscientos','setecientos','ochocientos','novecientos');
    
$resto=$todos;
    
    for (
$i=1$i<=$grupos$i++) {
        
        
// Hacemos el grupo
        
if ($resto>=3) {
            
$corte=3; } else {
            
$corte=$resto;
        }
            
$offset=(($i*3)-3)+$corte;
            
$offset=$offset*(-1);
        
        
// corremos el codigo posteado por 
        
        
$num=implode("",array_slice ($digitos,$offset,$corte));
        
$resultado[$i] = "";
        
$cen = (int) ($num 100);              //Cifra de las centenas
        
$doble $num - ($cen*100);             //Cifras de las decenas y unidades
        
$dec = (int)($num 10) - ($cen*10);    //Cifra de laa decenas
        
$uni $num - ($dec*10) - ($cen*100);   //Cifra de las unidades
        
if ($cen 0) {
           if (
$num == 100$resultado[$i] = "cien";
           else 
$resultado[$i] = $centena[$cen-1].' ';
        }
//end if
        
if ($doble>0) {
           if (
$doble == 20) {
              
$resultado[$i] .= " veinte";
           }elseif ((
$doble 16) and ($doble>9)) {
              
$resultado[$i] .= $decenas[$doble-10];
           }else {
              
$resultado[$i] .=' '$decena[$dec-1];
           }
//end if
           
if ($dec>and $uni<>0$resultado[$i] .=' y ';
           if ((
$uni>0) and ($doble>15) or ($dec==0)) {
              if (
$i==&& $uni == 1$resultado[$i].="uno";
              else 
$resultado[$i].=$unidad[$uni-1];
           }
        }

        
// Le agregamos la terminacion del grupo
        
switch ($i) {
            case 
2:
            
$resultado[$i].= ($resultado[$i]=="") ? "" " mil ";
            break;
            case 
3:
            
$resultado[$i].= ($num==1) ? " mill&oacute;n " " millones ";
            break;
        }
        
$resto-=$corte;
    }
    
    
// Sacamos el resultado (primero invertimos el array)
    
$resultado_invarray_reverse($resultadoTRUE);
    
$final="";
    foreach (
$resultado_inv as $parte){
        
$final.=$parte;
    }
    return 
$final;
}

// Corremos una prueba
echo numerotexto("$1,952,123.23");

?>
El codigo acepta numeros en formato de texto y en formato numerico. Ademas que te deja trabajar con numeros con decimales.

La parte de las decimales te la deja en $partes[1], y puedes hacer con ella lo que se te antoje



Si a alguien le sirve, o si alguien lo mejora, pues adelante

Saludos!
__________________
Manoloweb

Última edición por Manoloweb; 05/04/2003 a las 16:24
  #11 (permalink)  
Antiguo 05/04/2003, 15:34
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
NOTA: Trabaja hasta MILLONES, aunque pueden agregarsele mas niveles modificando esta seccion:

Código PHP:
        // Le agregamos la terminacion del grupo
        
switch ($i) {
            case 
2:
            
$resultado[$i].= ($resultado[$i]=="") ? "" " mil ";
            break;
            case 
3:
            
$resultado[$i].= ($num==1) ? " mill&oacute;n " " millones ";
            break;
        } 
__________________
Manoloweb

Última edición por Manoloweb; 05/04/2003 a las 16:25
  #12 (permalink)  
Antiguo 05/04/2003, 16:34
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Ahora bien... si a alguien no le gusta como suena "un mil", y prefiere que solo sea "mil"

solo agregue esta linea:

Código PHP:

              
if ($i==&& $uni == 1$resultado[$i].="uno";
              elseif (
$i==&& $num == 1$resultado[$i].="";//Esta es la linea nueva
              
else $resultado[$i].=$unidad[$uni-1]; 
__________________
Manoloweb

Última edición por Manoloweb; 05/04/2003 a las 17:09
  #13 (permalink)  
Antiguo 05/04/2003, 20:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Manoloweb .. te invito a subir tu código a las FAQ's del foro PHP ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 06/04/2003, 11:17
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5


Listo, Saludos!

(aunque yo solo lo modifique...)
__________________
Manoloweb
  #15 (permalink)  
Antiguo 23/04/2003, 16:26
 
Fecha de Ingreso: abril-2003
Mensajes: 13
Antigüedad: 21 años
Puntos: 0
ManoloWeb, partes[1] es parte?

Epa ManoloWeb!!!

$partes[1] es un arreglo donde se van guardando los segmentos?

exactamente que queda? un texto con los caracteres de los decimales?

Es que en algunos paises trasladan los numeros asi:

1,125.68

Queda: un mil ciento veinte y cinco con 68/100

los "68" son los que quedan en $partes[1] ?
  #16 (permalink)  
Antiguo 23/04/2003, 16:36
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Efectivamente, en formato numerico... sin el punto

asi que solo hacer esto:
Código PHP:
if ($partes[1]!=""){
 
$partes[1]=str_pad(substr($partes[1],0,2),2,"0",STR_PAD_LEFT);
 return 
$final." ".$partes[1]"/100";
} else {
 return 
$final." 00/100";


Acabo de mejorarlo, ya que no contemplaba que pudiera ser de mas (o menos) de dos digitos.

Saludos!
__________________
Manoloweb

Última edición por Manoloweb; 23/04/2003 a las 16:43
  #17 (permalink)  
Antiguo 12/04/2005, 19:33
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
Pregunta Una ultima duda como que daria con los decimales

Hola amigos estoy viedo que aqui esta todo para convertir numeros
a letras, pero soy algo despistado.
como quedaria el codigo final contando con los centavos despues del punto

espero que me puedan acesorar amigos

gracias
__________________
gerardo
  #18 (permalink)  
Antiguo 11/07/2007, 14:30
 
Fecha de Ingreso: abril-2005
Ubicación: colombia
Mensajes: 242
Antigüedad: 19 años
Puntos: 0
Re: Conversion de numeros a letras

gracias me ha servido mucho, pero no he podido mostrar los decimales , agregue esto pero siempre me sale cero/100 , ya que el caracter de relleno es cero, como hago para cambiar esto para que me salgan los decimales que son .

if ($parte[1]!=""){
$parte[1]=str_pad(substr($parte[1],0,2),2,"0",STR_PAD_LEFT);
return $final." ".$parte[1]"/100";
} else {
return $final." 00/100";
}

gracias
__________________
:aplauso: Ivomat
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:28.