Grupo Linuxero del Bajio

Bienvenido a glib.org.mx
viernes, octubre 24 2014 @ 09:41 CDT

C贸digo PHP para convertir de n煤meros a letras

PreguntasTen铆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] = \"novecientos\";
If ($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 = \"\";

while ($Numero != 0){

// \'*---> Validaci贸n si se pasa de 100 millones

If ($Numero >= 1000000000) {
$letras = \"Error en Conversi贸n a Letras\";
$Numero = 0;
$Decimales = 0;
}

// \'*---> Centenas de Mill贸n
If (($Numero < 1000000000) And ($Numero >= 100000000)){
If ((Intval($Numero / 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 = $Numero - (Intval($Numero / 100000000) * 100000000);
}

// \'*---> Decenas de Mill贸n
If (($Numero < 100000000) And ($Numero >= 10000000)) {
If (Intval($Numero / 1000000) < 16) {
$tempo = Decenas(Intval($Numero / 1000000));
$letras .= (string) $tempo;
$letras .= (string) \" millones \";
$Numero = $Numero - (Intval($Numero / 1000000) * 1000000);
}
Else {
$letras = $letras & Decenas(Intval($Numero / 10000000) * 10);
$Numero = $Numero - (Intval($Numero / 10000000) * 10000000);
If ($Numero > 1000000) {
$letras .= $letras & \" y \";
}
}
}

// \'*---> Unidades de Mill贸n
If (($Numero < 10000000) And ($Numero >= 1000000)) {
$tempo=(Intval($Numero / 1000000));
If ($tempo == 1) {
$letras .= (string) \" un mill贸n \";
}
Else {
$tempo= Unidades(Intval($Numero / 1000000));
$letras .= (string) $tempo;
$letras .= (string) \" millones \";
}
$Numero = $Numero - (Intval($Numero / 1000000) * 1000000);
}

// \'*---> Centenas de Millar
If (($Numero < 1000000) And ($Numero >= 100000)) {
$tempo=(Intval($Numero / 100000));
$tempo2=($Numero - ($tempo * 100000));
If (($tempo == 1) And ($tempo2 < 1000)) {
$letras .= (string) \"cien mil \";
}
Else {
$tempo=Centenas(Intval($Numero / 100000));
$letras .= (string) $tempo;
$tempo=(Intval($Numero / 100000));
If (($tempo <> 1) And ($tempo <> 5) And ($tempo <> 7) And ($tempo <> 9)) {
$letras .= (string) \"cientos \";
}
Else {
$letras .= (string) \" \";
}
}
$Numero = $Numero - (Intval($Numero / 100000) * 100000);
}

// \'*---> Decenas de Millar
If (($Numero < 100000) And ($Numero >= 10000)) {
$tempo= (Intval($Numero / 1000));
If ($tempo < 16) {
$tempo = Decenas(Intval($Numero / 1000));
$letras .= (string) $tempo;
$letras .= (string) \" mil \";
$Numero = $Numero - (Intval($Numero / 1000) * 1000);
}
Else {
$tempo = Decenas(Intval($Numero / 10000) * 10);
$letras .= (string) $tempo;
$Numero = $Numero - (Intval(($Numero / 10000)) * 10000);
If ($Numero > 1000) {
$letras .= (string) \" y \";
}
Else {
$letras .= (string) \" mil \";

}
}
}


// \'*---> Unidades de Millar
If (($Numero < 10000) And ($Numero >= 1000)) {
$tempo=(Intval($Numero / 1000));
If ($tempo == 1) {
$letras .= (string) \"un\";
}
Else {
$tempo = Unidades(Intval($Numero / 1000));
$letras .= (string) $tempo;
}
$letras .= (string) \" mil \";
$Numero = $Numero - (Intval($Numero / 1000) * 1000);
}

// \'*---> Centenas
If (($Numero < 1000) And ($Numero > 99)) {
If ((Intval($Numero / 100) == 1) And (($Numero - (Intval($Numero / 100) * 100)) < 1)) {
$letras = $letras & \"cien \";
}
Else {
$temp=(Intval($Numero / 100));
$l2=Centenas($temp);
$letras .= (string) $l2;
If ((Intval($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(Intval($Numero));
$letras .= $tempo;
$Numero = $Numero - Intval($Numero);
}
Else {
$tempo= Decenas(Intval(($Numero / 10)) * 10);
$letras .= (string) $tempo;
$Numero = $Numero - (Intval(($Numero / 10)) * 10);
If ($Numero > 0.99) {
$letras .=(string) \" y \";

}
}
}

// \'*---> Unidades
If (($Numero < 10) And ($Numero > 0.99)) {
$tempo=Unidades(Intval($Numero));
$letras .= (string) $tempo;

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


// \'*---> Decimales
If ($Decimales > 0) {

// $letras .=(string) \" con \";
// $Decimales= $Decimales*100;
// echo (\"*\");
// $Decimales = number_format($Decimales, 2);
// echo ($Decimales);
// $tempo = Decenas(Intval($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;
$Numero = intval($tt);
$Decimales = $tt - Intval($tt);
$Decimales= $Decimales*100;
$Decimales= Intval($Decimales);
$x=NumerosALetras($Numero);
echo ($x);
If ($Decimales > 0){

$y=NumerosALetras($Decimales);
echo (\" pesos con \");
echo ($y);
echo (\" centavos\");
}
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

Opciones de la Nota

C贸digo PHP para convertir de n煤meros a letras | 8 comentarios | Crear una Nueva Cuenta
Los siguientes comentarios son de quien sea que los haya enviado. Este sitio no es responsable por lo que dicen.
C贸digo PHP para convertir de n煤meros a letras
Escrito por: ceyusa sobreviernes, julio 11 2003 @ 11:46 CDT
Yo creo que puedes portar alguna que este Perl a PHP sin grandes complicaciones. Asi te evitas de estar creando codigo nuevo, que siempre tendra bugs (por lo menos en mi caso :P).

---
Vale
Ceyusa
[ Responder a | # ]
C贸digo PHP para convertir de n煤meros a letras
Escrito por: bebeboy sobres谩bado, julio 12 2003 @ 10:54 CDT
Platicando con algunos contadores, surgi贸 la siguiente problematica:

en el caso de $1001.21
se escribe : un mil y uno pesos con veinte y uno centavos
se escribe : mil y un pesos con veintiun centavos

algunos opinan que las dos respuestas son correctas, otros opinan que la primera, pero coloquial utilizamos la segunda.

驴existe algun documento o referencia sobre la gram谩tica correcta?
Bebeboy
[ Responder a | # ]
C贸digo PHP para convertir de n煤meros a letras
Escrito por: Fromage sobrejueves, diciembre 09 2004 @ 06:01 CST
El problema est谩 al adjuntar el valor de las centenas a la variable $letras.

El c贸digo est谩 as铆:

$letras = $letras & \"cien \";

El c贸digo correcto es:

$letras .= (string) \" cien \";

Carlos.
[ Responder a | # ]