Grupo Linuxero del Bajío

Código PHP para convertir de números a letras

Luis Rey Lara

Tenía la necesidad de convertir cantidades númericas a letras, ejemplo:

entrada: $234.56

salida :(doscientos treinta y cuatro pesos con cincuenta y seis centavos)

Buscando en google solo pude encontrar codigo en pascal, python, vb, pero no pude encontrar el código hecho en php.

Lo traducí de código visual basic a php.

Arrojando lo siguiente:

//— corte inicial <?php function Centenas($VCentena) { $Numeros[0] = "cero"; $Numeros[1] = "uno"; $Numeros[2] = "dos"; $Numeros[3] = "tres"; $Numeros[4] = "cuatro"; $Numeros[5] = "cinco"; $Numeros[6] = "seis"; $Numeros[7] = "siete"; $Numeros[8] = "ocho"; $Numeros[9] = "nueve"; $Numeros[10] = "diez"; $Numeros[11] = "once"; $Numeros[12] = "doce"; $Numeros[13] = "trece"; $Numeros[14] = "catorce"; $Numeros[15] = "quince"; $Numeros[20] = "veinte"; $Numeros[30] = "treinta"; $Numeros[40] = "cuarenta"; $Numeros[50] = "cincuenta"; $Numeros[60] = "sesenta"; $Numeros[70] = "setenta"; $Numeros[80] = "ochenta"; $Numeros[90] = "noventa"; $Numeros[100] = "ciento"; $Numeros[101] = "quinientos"; $Numeros[102] = "setecientos"; Numeros[103] = &quo**t; novecientos&quo**t;;I**f(VCentena == 1) { return $Numeros[100]; } Else If ($VCentena == 5) { return $Numeros[101];} Else If ($VCentena == 7 ) {return ( $Numeros[102]); } Else If ($VCentena == 9) {return ($Numeros[103]);} Else {return Numeros[VCentena];}

}

function Unidades($VUnidad) { $Numeros[0] = "cero"; $Numeros[1] = "un"; $Numeros[2] = "dos"; $Numeros[3] = "tres"; $Numeros[4] = "cuatro"; $Numeros[5] = "cinco"; $Numeros[6] = "seis"; $Numeros[7] = "siete"; $Numeros[8] = "ocho"; $Numeros[9] = "nueve"; $Numeros[10] = "diez"; $Numeros[11] = "once"; $Numeros[12] = "doce"; $Numeros[13] = "trece"; $Numeros[14] = "catorce"; $Numeros[15] = "quince"; $Numeros[20] = "veinte"; $Numeros[30] = "treinta"; $Numeros[40] = "cuarenta"; $Numeros[50] = "cincuenta"; $Numeros[60] = "sesenta"; $Numeros[70] = "setenta"; $Numeros[80] = "ochenta"; $Numeros[90] = "noventa"; $Numeros[100] = "ciento"; $Numeros[101] = "quinientos"; $Numeros[102] = "setecientos"; $Numeros[103] = "novecientos";

tempo=Numeros[$VUnidad]; return $tempo; }

function Decenas($VDecena) { $Numeros[0] = "cero"; $Numeros[1] = "uno"; $Numeros[2] = "dos"; $Numeros[3] = "tres"; $Numeros[4] = "cuatro"; $Numeros[5] = "cinco"; $Numeros[6] = "seis"; $Numeros[7] = "siete"; $Numeros[8] = "ocho"; $Numeros[9] = "nueve"; $Numeros[10] = "diez"; $Numeros[11] = "once"; $Numeros[12] = "doce"; $Numeros[13] = "trece"; $Numeros[14] = "catorce"; $Numeros[15] = "quince"; $Numeros[20] = "veinte"; $Numeros[30] = "treinta"; $Numeros[40] = "cuarenta"; $Numeros[50] = "cincuenta"; $Numeros[60] = "sesenta"; $Numeros[70] = "setenta"; $Numeros[80] = "ochenta"; $Numeros[90] = "noventa"; $Numeros[100] = "ciento"; $Numeros[101] = "quinientos"; $Numeros[102] = "setecientos"; $Numeros[103] = "novecientos"; tempo = (Numeros[$VDecena]); return $tempo; }

function NumerosALetras($Numero){

$Decimales = 0;
//$Numero = intval($Numero);
$letras = \&quot;\&quot;;

while ($Numero != 0){

// '*—> Validación si se pasa de 100 millones

   If ($Numero &gt;= 1000000000) {
      $letras = \&quot;Error en Conversión a Letras\&quot;;
      $Numero = 0;
      $Decimales = 0;
   }

// '*—> Centenas de Millón If (($Numero < 1000000000) And ($Numero >= 100000000)){ If ((Intval(Numer**o/100000000) =  = 1)And((Numero - (Intval($Numero / 100000000) * 100000000)) < 1000000)){ $letras .= (string) "cien millones "; } Else { $letras = $letras & Centenas(Intval($Numero / 100000000)); If ((Intval($Numero / 100000000) <> 1) And (Intval($Numero / 100000000) <> 5) And (Intval($Numero / 100000000) <> 7) And (Intval($Numero / 100000000) <> 9)) { $letras .= (string) "cientos "; } Else { $letras .= (string) " "; } } $Numero = Numer**o − (Intva**l(Numero / 100000000) * 100000000); }

// '*—> Decenas de Millón If (($Numero < 100000000) And ($Numero >= 10000000)) { If (Intval($Numero / 1000000) < 16) { tempo = Decenas(Intva**l(Numero / 1000000)); $letras .= (string) $tempo; $letras .= (string) " millones "; $Numero = Numer**o − (Intva**l(Numero / 1000000) * 1000000); } Else { $letras = $letras & Decenas(Intval($Numero / 10000000) * 10); $Numero = Numer**o − (Intva**l(Numero / 10000000) * 10000000); If ($Numero > 1000000) { $letras .= $letras & " y "; } } }

// '—> Unidades de Millón If (($Numero < 10000000) And ($Numero >= 1000000)) { tempo = (Intva**l(Numero / 1000000)); If ($tempo == 1) { $letras .= (string) " un millón "; } Else { tempo = Unidade**s(Intva**l(Numero / 1000000)); $letras .= (string) $tempo; $letras .= (string) " millones "; } $Numero = Numer**o − (Intva**l(Numero / 1000000) 1000000); }

// '—> Centenas de Millar If (($Numero < 1000000) And ($Numero >= 100000)) { tempo = (Intva**l(Numero / 100000)); tempo2 = (Numero - (tempo * 100000)); I**f((tempo == 1) And ($tempo2 < 1000)) { $letras .= (string) "cien mil "; } Else { tempo = Centena**s(Intva**l(Numero / 100000)); $letras .= (string) $tempo; tempo = (Intva**l(Numero / 100000)); If (($tempo <> 1) And ($tempo <> 5) And ($tempo <> 7) And ($tempo <> 9)) { $letras .= (string) "cientos "; } Else { $letras .= (string) " "; } } $Numero = Numer**o − (Intva**l(Numero / 100000) 100000); }

// '*—> Decenas de Millar If (($Numero < 100000) And ($Numero >= 10000)) { tempo = (Intva**l(Numero / 1000)); If ($tempo < 16) { tempo = Decenas(Intva**l(Numero / 1000)); $letras .= (string) $tempo; $letras .= (string) " mil "; $Numero = Numer**o − (Intva**l(Numero / 1000) * 1000); } Else { tempo = Decenas(Intva**l(Numero / 10000) * 10); $letras .= (string) $tempo; $Numero = Numer**o − (Intva**l((Numero / 10000)) * 10000); If ($Numero > 1000) { $letras .= (string) " y "; } Else { $letras .= (string) " mil ";

         }
      }
   }

// '—> Unidades de Millar If (($Numero < 10000) And ($Numero >= 1000)) { tempo = (Intva**l(Numero / 1000)); If ($tempo == 1) { $letras .= (string) "un"; } Else { tempo = Unidade**s(Intva**l(Numero / 1000)); $letras .= (string) $tempo; } $letras .= (string) " mil "; $Numero = Numer**o − (Intva**l(Numero / 1000) 1000); }

// '*—> Centenas If (($Numero < 1000) And ($Numero > 99)) { If ((Intval(Numer**o/100) =  = 1)And((Numero - (Intval($Numero / 100) * 100)) < 1)) { $letras = $letras & "cien "; } Else { tem**p = (Intva**l(Numero / 100)); l2 = Centena**s(temp); $letras .= (string) l2; I**f((Intva**l(Numero / 100) <> 1) And (Intval($Numero / 100) <> 5) And (Intval($Numero / 100) <> 7) And (Intval($Numero / 100) <> 9)) { $letras .= "cientos "; } Else { $letras .= (string) " "; } }

      $Numero = $Numero - (Intval($Numero / 100) * 100);

   }

// '—> Decenas If (($Numero < 100) And ($Numero > 9) ) { If ($Numero < 16 ) { tempo = Decenas(Intva**l(Numero)); $letras .= $tempo; $Numero = Numer**o − Intva**l(Numero); } Else { tempo = Decenas(Intva**l((Numero / 10)) 10); $letras .= (string) $tempo; $Numero = Numer**o − (Intva**l((Numero / 10)) * 10); If ($Numero > 0.99) { $letras .=(string) " y ";

         }
      }
}

// '*—> Unidades If (($Numero < 10) And ($Numero > 0.99)) { tempo = Unidade**s(Intva**l(Numero)); $letras .= (string) $tempo;

      $Numero = $Numero - Intval($Numero);
   }

// '*—> Decimales If ($Decimales > 0) {

// $letras .=(string) " con "; // $Decimales= $Decimales100; // echo (""); // Decimales = numbe**rformat(Decimales, 2); // echo ($Decimales); // tempo = Decenas(Intva**l(Decimales)); // $letras .= (string) $tempo; // $letras .= (string) \"centavos\"; } Else { If (($letras <> "Error en Conversión a Letras") And (strlen(Trim($letras)) > 0)) { $letras .= (string) " ";

    }
}
return $letras;

} }

//favor de teclear a mano la cantidad numerica a convertir y asignarla a $tt $tt = 151.21;

$tt = $tt+0.009; Numer**o = intva**l(tt); $Decimales = t**t − Intva**l(tt); $Decimales= $Decimales*100; Decimales = Intva**l(Decimales); x = NumerosALetra**s(Numero); echo (x); I**f(Decimales > 0){

$y=NumerosALetras($Decimales);
echo (\&quot; pesos con \&quot;);
echo ($y);
echo (\&quot; centavos\&quot;);

} else { echo ("cero centavos"); }

?>

//—corte final

en las funciones CENTENAS, UNIDADES, DECENAS, se repite unas lineas.

el codigo funciona,(pinche pero funcional) pero creo que se puede optimizar.

¿alguien me puede echar la mano? Bebeboy