Convertir importe a letras mediante PHP
Convertir importe a letras mediante PHP. En este artículo veremos 2 funciones para lograr el mismo objetivo de cómo convertir números a texto que podemos usarlo en facturación electrónica u otro uso que pudieran darle.
¿Cómo transformar números a letras con php?
Su uso es muy sencillo y para utilizarlo, solo descarguen el código y agreguen a su script o hagan un fichero externo a través de un include con la ruta al fichero que pueden descargar
Convertir importe a letras mediante PHP.
A continuación, mostraremos dos formas para lograr nuestro objetivo.
Primera Forma: Función numerosAletras
Uso del script
Lo único que necesitan utilizar es la siguiente instrucción de código. Por lo tanto, solo debemos de imprimir la funcion con la variable numerica para lograr la conversión deseada.
<?php $vara = "25.50"; echo numerosAletras($vara); //resultado: Veinticinco pesos 50/100 M.N. ?>
Función numerosAletras
Esta función será la encargada de convertir los importes, total a pagar en texto que es necesario mostrarlo en nuestra facturación electrónica. A continuación. les dejare la función completa.
<?php function numerosAletras($num, $fem = false, $dec = true) { $matuni[2] = "dos"; $matuni[3] = "tres"; $matuni[4] = "cuatro"; $matuni[5] = "cinco"; $matuni[6] = "seis"; $matuni[7] = "siete"; $matuni[8] = "ocho"; $matuni[9] = "nueve"; $matuni[10] = "diez"; $matuni[11] = "once"; $matuni[12] = "doce"; $matuni[13] = "trece"; $matuni[14] = "catorce"; $matuni[15] = "quince"; $matuni[16] = "dieciseis"; $matuni[17] = "diecisiete"; $matuni[18] = "dieciocho"; $matuni[19] = "diecinueve"; $matuni[20] = "veinte"; $matunisub[2] = "dos"; $matunisub[3] = "tres"; $matunisub[4] = "cuatro"; $matunisub[5] = "quin"; $matunisub[6] = "seis"; $matunisub[7] = "sete"; $matunisub[8] = "ocho"; $matunisub[9] = "nove"; $matdec[2] = "veint"; $matdec[3] = "treinta"; $matdec[4] = "cuarenta"; $matdec[5] = "cincuenta"; $matdec[6] = "sesenta"; $matdec[7] = "setenta"; $matdec[8] = "ochenta"; $matdec[9] = "noventa"; $matsub[3] = 'mill'; $matsub[5] = 'bill'; $matsub[7] = 'mill'; $matsub[9] = 'trill'; $matsub[11] = 'mill'; $matsub[13] = 'bill'; $matsub[15] = 'mill'; $matmil[4] = 'millones'; $matmil[6] = 'billones'; $matmil[7] = 'de billones'; $matmil[8] = 'millones de billones'; $matmil[10] = 'trillones'; $matmil[11] = 'de trillones'; $matmil[12] = 'millones de trillones'; $matmil[13] = 'de trillones'; $matmil[14] = 'billones de trillones'; $matmil[15] = 'de billones de trillones'; $matmil[16] = 'millones de billones de trillones'; //Zi hack $float=explode('.',$num); $num=$float[0]; $num = trim((string)@$num); if ($num[0] == '-') { $neg = 'menos '; $num = substr($num, 1); }else $neg = ''; while ($num[0] == '0') $num = substr($num, 1); if ($num[0] < '1' or $num[0] > 9) $num = '0' . $num; $zeros = true; $punt = false; $ent = ''; $fra = ''; for ($c = 0; $c < strlen($num); $c++) { $n = $num[$c]; if (! (strpos(".,'''", $n) === false)) { if ($punt) break; else{ $punt = true; continue; } }elseif (! (strpos('0123456789', $n) === false)) { if ($punt) { if ($n != '0') $zeros = false; $fra .= $n; }else $ent .= $n; }else break; } $ent = ' ' . $ent; if ($dec and $fra and ! $zeros) { $fin = ' coma'; for ($n = 0; $n < strlen($fra); $n++) { if (($s = $fra[$n]) == '0') $fin .= ' cero'; elseif ($s == '1') $fin .= $fem ? ' una' : ' un'; else $fin .= ' ' . $matuni[$s]; } }else $fin = ''; if ((int)$ent === 0) return 'Cero ' . $fin; $tex = ''; $sub = 0; $mils = 0; $neutro = false; while ( ($num = substr($ent, -3)) != ' ') { $ent = substr($ent, 0, -3); if (++$sub < 3 and $fem) { $matuni[1] = 'una'; $subcent = 'as'; }else{ $matuni[1] = $neutro ? 'un' : 'uno'; $subcent = 'os'; } $t = ''; $n2 = substr($num, 1); if ($n2 == '00') { }elseif ($n2 < 21) $t = ' ' . $matuni[(int)$n2]; elseif ($n2 < 30) { $n3 = $num[2]; if ($n3 != 0) $t = 'i' . $matuni[$n3]; $n2 = $num[1]; $t = ' ' . $matdec[$n2] . $t; }else{ $n3 = $num[2]; if ($n3 != 0) $t = ' y ' . $matuni[$n3]; $n2 = $num[1]; $t = ' ' . $matdec[$n2] . $t; } $n = $num[0]; if ($n == 1) { $t = ' ciento' . $t; }elseif ($n == 5){ $t = ' ' . $matunisub[$n] . 'ient' . $subcent . $t; }elseif ($n != 0){ $t = ' ' . $matunisub[$n] . 'cient' . $subcent . $t; } if ($sub == 1) { }elseif (! isset($matsub[$sub])) { if ($num == 1) { $t = ' mil'; }elseif ($num > 1){ $t .= ' mil'; } }elseif ($num == 1) { $t .= ' ' . $matsub[$sub] . '?n'; }elseif ($num > 1){ $t .= ' ' . $matsub[$sub] . 'ones'; } if ($num == '000') $mils ++; elseif ($mils != 0) { if (isset($matmil[$sub])) $t .= ' ' . $matmil[$sub]; $mils = 0; } $neutro = true; $tex = $t . $tex; } $tex = $neg . substr($tex, 1) . $fin; //Zi hack --> return ucfirst($tex); $end_num=ucfirst($tex).' pesos '.$float[1].'/100 M.N.'; return $end_num; } ?>
Segunda Forma: función number_words
El punto principal es pasar los parámetros a la función para un determinado nombre como pesos
, centavos
y una conjunción como y
, con
, etc. Veamos la función completa.
function number_words($valor,$desc_moneda, $sep, $desc_decimal) { $arr = explode(".", $valor); $entero = $arr[0]; if (isset($arr[1])) { $decimos = strlen($arr[1]) == 1 ? $arr[1] . '0' : $arr[1]; } $fmt = new \NumberFormatter('es', \NumberFormatter::SPELLOUT); if (is_array($arr)) { $num_word = ($arr[0]>=1000000) ? "{$fmt->format($entero)} de $desc_moneda" : "{$fmt->format($entero)} $desc_moneda"; if (isset($decimos) && $decimos > 0) { $num_word .= " $sep {$fmt->format($decimos)} $desc_decimal"; } } return $num_word; }
Usabilidad de la función
Solo debemos llamar la función e incorporar la moneda que puede ser una variable o un registro extraído de la base de datos. Aquí algunos ejemplos
echo number_words("10.10","pesos","y","centavos"); echo number_words("10","pesos","y","centavos"); echo number_words("1000000","pesos","y","centavos"); echo number_words("0.25","pesos","y","centavos"); echo number_words("500.35","dólares","con","centavos");
Salida en el navegador
Una vez que ejecutamos el script en el navegador, mostrara lo siguiente
diez pesos y diez centavos diez pesos un millón de pesos cero pesos y veinticinco centavos quinientos dólares con treinta y cinco centavos
CONCLUSION
Hemos aprendido a usar esta maravillosa función para convertir números de nuestras boletas, facturas, etc. a letras.
Su uso es muy sencillo, solo debemos llamar a función y embeber la variable de la moneda.
Espero que esta breve explicación les ayude en sus proyectos web.
hola, hubo alguna solución para corregir el CIENTO PESOS 00/100 M.N.?
hay un error, si pones solo 100 te aparece como CIENTO PESOS 00/100 M.N.
Buenos dias, muchas gracias por compartir el código, lo acabo de usar, solo tuve que agregar una validación en el while de la primer forma: Primera Forma: Función numerosAletras, como sigue:
while( ($num = substr($ent, -3)) != ‘ ‘ && ($num != ») && ($num != false)) {
porque algunas veces se quedaba ciclado
Se me cicla :c ya puse la condición en el while como comentó Sergio Iván y segui igual