-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathnumtoletras.php
More file actions
175 lines (163 loc) · 9.18 KB
/
numtoletras.php
File metadata and controls
175 lines (163 loc) · 9.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<?php
//------ CONVERTIR NUMEROS A LETRAS ---------------
//------ Máxima cifra soportada: 18 dígitos con 2 decimales
//------ 999,999,999,999,999,999.99
// NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE BILLONES
// NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE MILLONES
// NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE PESOS 99/100 M.N.
//------ Creada por: ---------------
//------ ULTIMINIO RAMOS GALÁN ---------------
//------ uramos@gmail.com ---------------
//------ 10 de junio de 2009. México, D.F. ---------------
//------ PHP Version 4.3.1 o mayores (aunque podría funcionar en versiones anteriores, tendrías que probar)
function numtoletras($xcifra)
{
$xarray = array(0 => "Cero",
1 => "UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE",
"DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE",
"VEINTI", 30 => "TREINTA", 40 => "CUARENTA", 50 => "CINCUENTA", 60 => "SESENTA", 70 => "SETENTA", 80 => "OCHENTA", 90 => "NOVENTA",
100 => "CIENTO", 200 => "DOSCIENTOS", 300 => "TRESCIENTOS", 400 => "CUATROCIENTOS", 500 => "QUINIENTOS", 600 => "SEISCIENTOS", 700 => "SETECIENTOS", 800 => "OCHOCIENTOS", 900 => "NOVECIENTOS"
);
//
$xcifra = trim($xcifra);
$xlength = strlen($xcifra);
$xpos_punto = strpos($xcifra, ".");
$xaux_int = $xcifra;
$xdecimales = "00";
if (!($xpos_punto === false)) {
if ($xpos_punto == 0) {
$xcifra = "0" . $xcifra;
$xpos_punto = strpos($xcifra, ".");
}
$xaux_int = substr($xcifra, 0, $xpos_punto); // obtengo el entero de la cifra a covertir
$xdecimales = substr($xcifra . "00", $xpos_punto + 1, 2); // obtengo los valores decimales
}
$XAUX = str_pad($xaux_int, 18, " ", STR_PAD_LEFT); // ajusto la longitud de la cifra, para que sea divisible por centenas de miles (grupos de 6)
$xcadena = "";
for ($xz = 0; $xz < 3; $xz++) {
$xaux = substr($XAUX, $xz * 6, 6);
$xi = 0;
$xlimite = 6; // inicializo el contador de centenas xi y establezco el límite a 6 dígitos en la parte entera
$xexit = true; // bandera para controlar el ciclo del While
while ($xexit) {
if ($xi == $xlimite) { // si ya llegó al límite máximo de enteros
break; // termina el ciclo
}
$x3digitos = ($xlimite - $xi) * -1; // comienzo con los tres primeros digitos de la cifra, comenzando por la izquierda
$xaux = substr($xaux, $x3digitos, abs($x3digitos)); // obtengo la centena (los tres dígitos)
for ($xy = 1; $xy < 4; $xy++) { // ciclo para revisar centenas, decenas y unidades, en ese orden
switch ($xy) {
case 1: // checa las centenas
if (substr($xaux, 0, 3) < 100) { // si el grupo de tres dígitos es menor a una centena ( < 99) no hace nada y pasa a revisar las decenas
} else {
$key = (int) substr($xaux, 0, 3);
if (TRUE === array_key_exists($key, $xarray)){ // busco si la centena es número redondo (100, 200, 300, 400, etc..)
$xseek = $xarray[$key];
$xsub = subfijo($xaux); // devuelve el subfijo correspondiente (Millón, Millones, Mil o nada)
if (substr($xaux, 0, 3) == 100)
$xcadena = " " . $xcadena . " CIEN " . $xsub;
else
$xcadena = " " . $xcadena . " " . $xseek . " " . $xsub;
$xy = 3; // la centena fue redonda, entonces termino el ciclo del for y ya no reviso decenas ni unidades
}
else { // entra aquí si la centena no fue numero redondo (101, 253, 120, 980, etc.)
$key = (int) substr($xaux, 0, 1) * 100;
$xseek = $xarray[$key]; // toma el primer caracter de la centena y lo multiplica por cien y lo busca en el arreglo (para que busque 100,200,300, etc)
$xcadena = " " . $xcadena . " " . $xseek;
} // ENDIF ($xseek)
} // ENDIF (substr($xaux, 0, 3) < 100)
break;
case 2: // checa las decenas (con la misma lógica que las centenas)
if (substr($xaux, 1, 2) < 10) {
} else {
$key = (int) substr($xaux, 1, 2);
if (TRUE === array_key_exists($key, $xarray)) {
$xseek = $xarray[$key];
$xsub = subfijo($xaux);
if (substr($xaux, 1, 2) == 20)
$xcadena = " " . $xcadena . " VEINTE " . $xsub;
else
$xcadena = " " . $xcadena . " " . $xseek . " " . $xsub;
$xy = 3;
}
else {
$key = (int) substr($xaux, 1, 1) * 10;
$xseek = $xarray[$key];
if (20 == substr($xaux, 1, 1) * 10)
$xcadena = " " . $xcadena . " " . $xseek;
else
$xcadena = " " . $xcadena . " " . $xseek . " Y ";
} // ENDIF ($xseek)
} // ENDIF (substr($xaux, 1, 2) < 10)
break;
case 3: // checa las unidades
if (substr($xaux, 2, 1) < 1) { // si la unidad es cero, ya no hace nada
} else {
$key = (int) substr($xaux, 2, 1);
$xseek = $xarray[$key]; // obtengo directamente el valor de la unidad (del uno al nueve)
$xsub = subfijo($xaux);
$xcadena = " " . $xcadena . " " . $xseek . " " . $xsub;
} // ENDIF (substr($xaux, 2, 1) < 1)
break;
} // END SWITCH
} // END FOR
$xi = $xi + 3;
} // ENDDO
if (substr(trim($xcadena), -5, 5) == "ILLON") // si la cadena obtenida termina en MILLON o BILLON, entonces le agrega al final la conjuncion DE
$xcadena.= " DE";
if (substr(trim($xcadena), -7, 7) == "ILLONES") // si la cadena obtenida en MILLONES o BILLONES, entoncea le agrega al final la conjuncion DE
$xcadena.= " DE";
// ----------- esta línea la puedes cambiar de acuerdo a tus necesidades o a tu país -------
if (trim($xaux) != "") {
switch ($xz) {
case 0:
if (trim(substr($XAUX, $xz * 6, 6)) == "1")
$xcadena.= "UN BILLON ";
else
$xcadena.= " BILLONES ";
break;
case 1:
if (trim(substr($XAUX, $xz * 6, 6)) == "1")
$xcadena.= "UN MILLON ";
else
$xcadena.= " MILLONES ";
break;
case 2:
if ($xcifra < 1) {
$xcadena = "CERO PESOS $xdecimales/100 M.N.";
}
if ($xcifra >= 1 && $xcifra < 2) {
$xcadena = "UN PESO $xdecimales/100 M.N. ";
}
if ($xcifra >= 2) {
$xcadena.= " PESOS $xdecimales/100 M.N. "; //
}
break;
} // endswitch ($xz)
} // ENDIF (trim($xaux) != "")
// ------------------ en este caso, para México se usa esta leyenda ----------------
$xcadena = str_replace("VEINTI ", "VEINTI", $xcadena); // quito el espacio para el VEINTI, para que quede: VEINTICUATRO, VEINTIUN, VEINTIDOS, etc
$xcadena = str_replace(" ", " ", $xcadena); // quito espacios dobles
$xcadena = str_replace("UN UN", "UN", $xcadena); // quito la duplicidad
$xcadena = str_replace(" ", " ", $xcadena); // quito espacios dobles
$xcadena = str_replace("BILLON DE MILLONES", "BILLON DE", $xcadena); // corrigo la leyenda
$xcadena = str_replace("BILLONES DE MILLONES", "BILLONES DE", $xcadena); // corrigo la leyenda
$xcadena = str_replace("DE UN", "UN", $xcadena); // corrigo la leyenda
} // ENDFOR ($xz)
return trim($xcadena);
}
// END FUNCTION
function subfijo($xx)
{ // esta función regresa un subfijo para la cifra
$xx = trim($xx);
$xstrlen = strlen($xx);
if ($xstrlen == 1 || $xstrlen == 2 || $xstrlen == 3)
$xsub = "";
//
if ($xstrlen == 4 || $xstrlen == 5 || $xstrlen == 6)
$xsub = "MIL";
//
return $xsub;
}
// END FUNCTION
?>