Hace algunos días estaba realizando un sistema de información para la compañía en la que trabajo y entre todas las cosas que tenia que hacer este sistemas se incluía el hecho de realizar facturas de venta.
Hace mucho tiempo que no realizaba este típico proceso, por lo cual tuve que hacer memoria de mis clases de Bases De Datos recibidas en la Universidad y recordar que en la mayoría de casos una factura tiene un Encabezado, un Detalle y un Pie o Total.
Al fin pude realizar la factura y su modelo, pero el problema vino cuando me dijeron que el valor de la factura debía estar escrito en letras. Después de mucho tiempo de intentar crear una función que me permitiera esto, decidí buscar en Google y me encontré con esta excelente función que nos permite realizar esto sin ningún problema.
-
<?
-
/*
-
@function num2letras ()
-
@abstract Dado un n?mero lo devuelve escrito.
-
@param $num number - N?mero a convertir.
-
@param $fem bool - Forma femenina (true) o no (false).
-
@param $dec bool - Con decimales (true) o no (false).
-
@result string - Devuelve el n?mero escrito en letra.
-
*/
-
function num2letras($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';
-
-
if ($num[0] == '-') {
-
$neg = 'menos ';
-
}else
-
$neg = '';
-
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 ($punt) break;
-
else{
-
$punt = true;
-
continue;
-
}
-
-
if ($punt) {
-
if ($n != '0') $zeros = false;
-
$fra .= $n;
-
}else
-
-
$ent .= $n;
-
}else
-
<p align="justify">break;</p>
-
}
-
$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;
-
if (++$sub <3 and $fem) {
-
$matuni[1] = 'una';
-
$subcent = 'as';
-
}else{
-
$matuni[1] = $neutro ? 'un' : 'uno';
-
$subcent = 'os';
-
}
-
$t = '';
-
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) {
-
if ($n2 <> '00') {
-
$t = ' ciento' . $t;
-
} else {
-
$t = ' cien' . $t;
-
}
-
}elseif ($n == 5){
-
$t = ' ciento' . $t;
-
}elseif ($n == 5){
-
$t = ' ' . $matunisub[$n] . 'ient' . $subcent . $t;
-
}elseif ($n != 0){
-
$t = ' ' . $matunisub[$n] . 'cient' . $subcent . $t;
-
}
-
if ($sub == 1) {
-
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) {
-
$mils = 0;
-
}
-
$neutro = true;
-
$tex = $t . $tex;
-
}
-
}
-
?>
Para llamar a la función sencillamente incluimos el archivo donde tenemos y la funcion y la llamos asi:





Julio 7th, 2008 at 11:49
esto se puede hacer en Excel, por ejemplo?
Julio 7th, 2008 at 12:20
Existe una forma de hacerlo en Excel pero creando un modulo especial con el codigo necesario en VisualBasic. En esta dirección tienes un ejemplo.
Julio 7th, 2008 at 13:36
Muchas gracias, es que me aburrí de la pagadera de cheques dañados por culpa de las diferencias entre números y letras cuando hacemos los cheques en Excel, mi secretaria se mama al menos un cheque diario.