Autor
|
Tema: Problema con funcion convierte numero en letra (Leído 4,445 veces)
|
maxwellnewage
Desconectado
Mensajes: 245
|
este es el code <?php function num2letras($num, $fem = true, $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';
$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; return ucfirst($tex); }
?> su declaracion: Mi problema es que por ejemplo 4,8 lo lee como "cuatro coma ocho" y me piden que se lea como "cuatro coma ochenta". Se que la funcion va a tomar "cuatro coma cero ocho" en ese caso, pero asi me lo piden...
|
|
« Última modificación: 22 Abril 2010, 16:02 pm por maxwellnewage »
|
En línea
|
|
|
|
raul338
Desconectado
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
Entonces "parte la funcion", separa el string por coma y convierte las 2 partes en numeros (cortando la parte decimal a dos digitos) ej: 124,502 partes por la coma y tienes: 124 y 502 conviertes 124 a letras: Ciento veinte y cuatro (:| corrijanme porque recien me despierto xD) y a 502 lo recortas a 2 caracteres (te fijas si redondeas): 50 lo pasas a numeros: Cincuenta y lo unes por "coma": Ciento veinte y cuatro coma cincuenta espero que te sirva
|
|
|
En línea
|
|
|
|
maxwellnewage
Desconectado
Mensajes: 245
|
podes ser mas grafico? xD no me llevo bien con las funciones -.-
|
|
|
En línea
|
|
|
|
maxwellnewage
Desconectado
Mensajes: 245
|
consegui otra funcion...pero 3.28 me tira error Notice: Undefined variable: num_letra in C:\wamp\www\prueba\decimal.php on line 68 tres con veinti la funcion <?php // FUNCIONES DE CONVERSION DE NUMEROS A LETRAS.
function centimos() { global $importe_parcial;
$importe_parcial = number_format($importe_parcial, 2, ".", "") * 100;
if ($importe_parcial > 0) $num_letra = " con ".decena_centimos($importe_parcial); else $num_letra = "";
return $num_letra; }
function unidad_centimos($numero) { switch ($numero) { case 9: { $num_letra = "nueve centavos"; break; } case 8: { $num_letra = "ocho centavos"; break; } case 7: { $num_letra = "siete centavos"; break; } case 6: { $num_letra = "seis centavos"; break; } case 5: { $num_letra = "cinco centavos"; break; } case 4: { $num_letra = "cuatro centavos"; break; } case 3: { $num_letra = "tres centavos"; break; } case 2: { $num_letra = "dos centavos"; break; } case 1: { $num_letra = "un centavo"; break; } } return $num_letra; }
function decena_centimos($numero) { if ($numero >= 10) { if ($numero >= 90 && $numero <= 99) { if ($numero == 90) return "noventa centavos"; else if ($numero == 91) return "noventa y un centavos"; else return "noventa y ".unidad_centimos($numero - 90); } if ($numero >= 80 && $numero <= 89) { if ($numero == 80) return "ochenta centavos"; else if ($numero == 81) return "ochenta y un centavos"; else return "ochenta y ".unidad_centimos($numero - 80); } if ($numero >= 70 && $numero <= 79) { if ($numero == 70) return "setenta centavos"; else if ($numero == 71) return "setenta y un centavos"; else return "setenta y ".unidad_centimos($numero - 70); } if ($numero >= 60 && $numero <= 69) { if ($numero == 60) return "sesenta centavos"; else if ($numero == 61) return "sesenta y un centavos"; else return "sesenta y ".unidad_centimos($numero - 60); } if ($numero >= 50 && $numero <= 59) { if ($numero == 50) return "cincuenta centavos"; else if ($numero == 51) return "cincuenta y un centavos"; else return "cincuenta y ".unidad_centimos($numero - 50); } if ($numero >= 40 && $numero <= 49) { if ($numero == 40) return "cuarenta centavos"; else if ($numero == 41) return "cuarenta y un centavos"; else return "cuarenta y ".unidad_centimos($numero - 40); } if ($numero >= 30 && $numero <= 39) { if ($numero == 30) return "treinta centavos"; else if ($numero == 91) return "treinta y un centavos"; else return "treinta y ".unidad_centimos($numero - 30); } if ($numero >= 20 && $numero <= 29) { if ($numero == 20) return "veinte centavos"; else if ($numero == 21) return "veintiun centavos"; else return "veinti".unidad_centimos($numero - 20); } if ($numero >= 10 && $numero <= 19) { if ($numero == 10) return "diez centavos"; else if ($numero == 11) return "once centavos"; else if ($numero == 11) return "doce centavos"; else if ($numero == 11) return "trece centavos"; else if ($numero == 11) return "catorce centavos"; else if ($numero == 11) return "quince centavos"; else if ($numero == 11) return "dieciseis centavos"; else if ($numero == 11) return "diecisiete centavos"; else if ($numero == 11) return "dieciocho centavos"; else if ($numero == 11) return "diecinueve centavos"; } } else return unidad_centimos($numero); }
function unidad($numero) { switch ($numero) { case 9: { $num = "nueve"; break; } case 8: { $num = "ocho"; break; } case 7: { $num = "siete"; break; } case 6: { $num = "seis"; break; } case 5: { $num = "cinco"; break; } case 4: { $num = "cuatro"; break; } case 3: { $num = "tres"; break; } case 2: { $num = "dos"; break; } case 1: { $num = "uno"; break; } } return $num; }
function decena($numero) { if ($numero >= 90 && $numero <= 99) { $num_letra = "noventa "; if ($numero > 90) $num_letra = $num_letra."y ".unidad($numero - 90); } else if ($numero >= 80 && $numero <= 89) { $num_letra = "ochenta "; if ($numero > 80) $num_letra = $num_letra."y ".unidad($numero - 80); } else if ($numero >= 70 && $numero <= 79) { $num_letra = "setenta "; if ($numero > 70) $num_letra = $num_letra."y ".unidad($numero - 70); } else if ($numero >= 60 && $numero <= 69) { $num_letra = "sesenta "; if ($numero > 60) $num_letra = $num_letra."y ".unidad($numero - 60); } else if ($numero >= 50 && $numero <= 59) { $num_letra = "cincuenta "; if ($numero > 50) $num_letra = $num_letra."y ".unidad($numero - 50); } else if ($numero >= 40 && $numero <= 49) { $num_letra = "cuarenta "; if ($numero > 40) $num_letra = $num_letra."y ".unidad($numero - 40); } else if ($numero >= 30 && $numero <= 39) { $num_letra = "treinta "; if ($numero > 30) $num_letra = $num_letra."y ".unidad($numero - 30); } else if ($numero >= 20 && $numero <= 29) { if ($numero == 20) $num_letra = "veinte "; else $num_letra = "veinti".unidad($numero - 20); } else if ($numero >= 10 && $numero <= 19) { switch ($numero) { case 10: { $num_letra = "diez "; break; } case 11: { $num_letra = "once "; break; } case 12: { $num_letra = "doce "; break; } case 13: { $num_letra = "trece "; break; } case 14: { $num_letra = "catorce "; break; } case 15: { $num_letra = "quince "; break; } case 16: { $num_letra = "dieciseis "; break; } case 17: { $num_letra = "diecisiete "; break; } case 18: { $num_letra = "dieciocho "; break; } case 19: { $num_letra = "diecinueve "; break; } } } else $num_letra = unidad($numero);
return $num_letra; }
function centena($numero) { if ($numero >= 100) { if ($numero >= 900 & $numero <= 999) { $num_letra = "novecientos "; if ($numero > 900) $num_letra = $num_letra.decena($numero - 900); } else if ($numero >= 800 && $numero <= 899) { $num_letra = "ochocientos "; if ($numero > 800) $num_letra = $num_letra.decena($numero - 800); } else if ($numero >= 700 && $numero <= 799) { $num_letra = "setecientos "; if ($numero > 700) $num_letra = $num_letra.decena($numero - 700); } else if ($numero >= 600 && $numero <= 699) { $num_letra = "seiscientos "; if ($numero > 600) $num_letra = $num_letra.decena($numero - 600); } else if ($numero >= 500 && $numero <= 599) { $num_letra = "quinientos "; if ($numero > 500) $num_letra = $num_letra.decena($numero - 500); } else if ($numero >= 400 && $numero <= 499) { $num_letra = "cuatrocientos "; if ($numero > 400) $num_letra = $num_letra.decena($numero - 400); } else if ($numero >= 300 && $numero <= 399) { $num_letra = "trescientos "; if ($numero > 300) $num_letra = $num_letra.decena($numero - 300); } else if ($numero >= 200 && $numero <= 299) { $num_letra = "doscientos "; if ($numero > 200) $num_letra = $num_letra.decena($numero - 200); } else if ($numero >= 100 && $numero <= 199) { if ($numero == 100) $num_letra = "cien "; else $num_letra = "ciento ".decena($numero - 100); } } else $num_letra = decena($numero); return $num_letra; }
function cien() { global $importe_parcial; $parcial = 0; $car = 0; while (substr($importe_parcial, 0, 1) == 0) $importe_parcial = substr($importe_parcial, 1, strlen($importe_parcial) - 1); if ($importe_parcial >= 1 && $importe_parcial <= 9.99) $car = 1; else if ($importe_parcial >= 10 && $importe_parcial <= 99.99) $car = 2; else if ($importe_parcial >= 100 && $importe_parcial <= 999.99) $car = 3; $parcial = substr($importe_parcial, 0, $car); $importe_parcial = substr($importe_parcial, $car); $num_letra = centena($parcial).centimos(); return $num_letra; }
function cien_mil() { global $importe_parcial; $parcial = 0; $car = 0; while (substr($importe_parcial, 0, 1) == 0) $importe_parcial = substr($importe_parcial, 1, strlen($importe_parcial) - 1); if ($importe_parcial >= 1000 && $importe_parcial <= 9999.99) $car = 1; else if ($importe_parcial >= 10000 && $importe_parcial <= 99999.99) $car = 2; else if ($importe_parcial >= 100000 && $importe_parcial <= 999999.99) $car = 3; $parcial = substr($importe_parcial, 0, $car); $importe_parcial = substr($importe_parcial, $car); if ($parcial > 0) { if ($parcial == 1) $num_letra = "mil "; else $num_letra = centena($parcial)." mil "; } return $num_letra; }
function millon() { global $importe_parcial; $parcial = 0; $car = 0; while (substr($importe_parcial, 0, 1) == 0) $importe_parcial = substr($importe_parcial, 1, strlen($importe_parcial) - 1); if ($importe_parcial >= 1000000 && $importe_parcial <= 9999999.99) $car = 1; else if ($importe_parcial >= 10000000 && $importe_parcial <= 99999999.99) $car = 2; else if ($importe_parcial >= 100000000 && $importe_parcial <= 999999999.99) $car = 3; $parcial = substr($importe_parcial, 0, $car); $importe_parcial = substr($importe_parcial, $car); if ($parcial == 1) $num_letras = "un millón "; else $num_letras = centena($parcial)." millones "; return $num_letras; }
function convertir_a_letras($numero) { global $importe_parcial; $importe_parcial = $numero; if ($numero < 1000000000) { if ($numero >= 1000000 && $numero <= 999999999.99) $num_letras = millon().cien_mil().cien(); else if ($numero >= 1000 && $numero <= 999999.99) $num_letras = cien_mil().cien(); else if ($numero >= 1 && $numero <= 999.99) $num_letras = cien(); else if ($numero >= 0.01 && $numero <= 0.99) { if ($numero == 0.01) $num_letras = "un centavo"; else $num_letras = convertir_a_letras(($numero * 100)."/100")." centavos"; } } return $num_letras; } ?>
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
PROBLEMA CON NUMERO IMAGINARIO
Programación Visual Basic
|
Sergioemus
|
1
|
2,304
|
22 Noviembre 2011, 08:13 am
por BlackZeroX
|
|
|
problema virtual key codes en c++ letra ñ en keylogger
Programación C/C++
|
ahaugas
|
2
|
5,038
|
26 Julio 2012, 18:31 pm
por ahaugas
|
|
|
Un problema de lógica infantil se convierte en todo un fenómeno viral en China
Noticias
|
wolfbcn
|
8
|
3,452
|
11 Junio 2014, 04:01 am
por Gh057
|
|
|
Estudiando función que convierte a mayúscula un carácter con operadores de bit
Programación C/C++
|
kutcher
|
8
|
4,162
|
1 Julio 2014, 16:59 pm
por kutcher
|
|
|
Numero por letra en cadena
Programación C/C++
|
alexismr
|
3
|
2,655
|
24 Marzo 2015, 17:52 pm
por alexismr
|
|