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ú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>2 and $uni<>0) $resultado[$i] .=' y ';
if (($uni>0) and ($doble>15) or ($dec==0)) {
if ($i==1 && $uni == 1) $resultado[$i].="uno";
elseif ($i==2 && $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ón " : " millones ";
break;
}
$resto-=$corte;
}
// Sacamos el resultado (primero invertimos el array)
$resultado_inv= array_reverse($resultado, TRUE);
$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!