Tema: FAQ's de PHP
Ver Mensaje Individual
  #58 (permalink)  
Antiguo 05/04/2003, 21:15
Avatar de Manoloweb
Manoloweb
 
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Tema: Numeros
Pregunta: ¿Como convierto un número a una cadena de texto que lo represente (p.e.- 2,115 = Dos mil ciento quince)?
Respuesta: Utiliza el siguiente código (instrucciones para usarlo al final del post)


1.- Guarda esta función en un archivo, por ejemplo numeros.inc
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);
        
        
// la siguiente seccion es una adaptacion de la contribucion de cofyman y JavierB
        
        
$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 las 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";
              elseif (
$i==&& $num == 1$resultado[$i].="";
              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;
}

?>

Para llamarlo, solo incluye el archivo y llama a la función con el numero que quieres convertir. Puede venir en formato numerico (12345.67) o como cadena ("$ 4,127.87")

Código PHP:
<?
include ("numeros.inc");
$ejemplo1=56424.21;
$ejemplo2="$ 6,125,652.11"

echo numerotexto($ejemplo1);
echo 
"<br>"
echo numerotexto($ejemplo2);

?>
NOTA: La parte de los decimales no esta siendo usada, pero esta disponible (dentro de la funcion) como $partes[1], sera muy sencillo tomarla y utilizarla si a alguien le sirve de algo

Saludos!
__________________
Manoloweb