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 numéricas a letras, ejemplo:

entrada: $234.56

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

Buscando en Google solo pude encontrar código en Pascal, Python, Visual Basic, pero no pude encontrar el código hecho en PHP.

Lo traduje 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];
    } elseif ($VCentena == 5) {
        return $Numeros[101];
    } elseif ($VCentena == 7) {
        return $Numeros[102];
    } elseif ($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 & amp;
                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 & amp;
                Decenas(Intval($Numero / 10000000) * 10);
                $Numero = $Numero - Intval($Numero / 10000000) * 10000000;
                if ($Numero > 1000000) {
                    $letras .= $letras & amp;
                    " 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 & amp;
                "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 numérica 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 código funciona (pinche, pero funcional) pero creo que se puede optimizar.

¿Alguien me puede echar la mano? Bebeboy