Foros del Web » Programando para Internet » PHP »

Aporte: Números a palabras

Estas en el tema de Aporte: Números a palabras en el foro de PHP en Foros del Web. Buenas, De vez en cuando voy a ir dejando por aquí algunas de las funciones que voy haciendo para mi Framework khaus que pienso le ...
  #1 (permalink)  
Antiguo 19/07/2013, 08:55
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
De acuerdo Aporte: Números a palabras

Buenas,
De vez en cuando voy a ir dejando por aquí algunas de las funciones que voy haciendo para mi Framework khaus que pienso le pueden servir a más de alguno..

Este método lo hice hace poco ya que me surgió la necesidad para un proyecto..
En realidad es bastante simple.. no toma en cuenta números decimales y sólo llega hasta los billones, pero para un sistema de facturación de una mediana/pequeña empresa es más que suficiente..

Lo desarrollé porque al buscar funciones similares en internet encontré que los algoritmos que usaban y la cantidad de lineas era excesiva para algo que podría ser mucho mas simple.

Dejo el código y el link en github

Código PHP:
<?php
/**
 * Khaus Framework (http://github.com/rhyudek1/khaus)
 *
 * @link http://github.com/rhyudek1/khaus for the canonical source repository
 * @copyright Copyright (c) 2013 rhyudek1. (https://github.com/rhyudek1/khaus)
 * @license https://github.com/rhyudek1/khaus New BSD License
 *
 * @category    Khaus
 * @package     Khaus_Helper
 * @version     3:20130613
 */
class Khaus_Helper_Integer
{
    public static function 
num2word($numero)
    {
        
$positivoNegativo '';
        
$palabraFinal '';
        
$arrayFinal = array();
        
$arrayConjuntos = array(=> 'mil'=> 'millones'13 => 'billones');
        
$arrayPalabras = array(
            array(
'un''dos''tres''cuatro''cinco''seis''siete''ocho''nueve'),
            array(
'diez''veinte''treinta''cuarenta''cincuenta''sesenta''setenta''ochenta''noventa'),
            array(
'ciento''doscientos''trescientos''cuatrocientos''quinientos''seiscientos''setecientos''ochocientos''novecientos'),
        );
        if (
is_numeric($numero)) {
            if (
$numero == 0) {
                
$palabraFinal 'cero';
            } else {
                if (
$numero 0) {
                    
$positivoNegativo 'menos ';
                    
$numero $numero * -1;
                }
                
$numero = (string) $numero;
                for (
$o 0$i strlen($numero) - 1$i >= 0$i--) {
                    
$conector '';
                    
$numeroActual $numero{$i} - 1;
                    
$udc $o++ % 3;
                    if (isset(
$arrayConjuntos[$o])) {
                        
$conector ' ' $arrayConjuntos[$o];
                    }
                    if (
$numeroActual > -1) {
                        if (
$udc == && $numero{$i 1} > 0) {
                            
$conector ' y';
                        }
                        
$arrayFinal[] = $arrayPalabras[$udc][$numeroActual] . $conector;
                    } else {
                        if (!empty(
$conector)) {
                            
$arrayFinal[] = $conector;
                        }
                    }
                }
                
$arrayFinal array_reverse($arrayFinal);
                
$palabraFinal $positivoNegativo implode(' '$arrayFinal);
                
$palabraFinal preg_replace('/ +/'' '$palabraFinal);
                
$reemplazos = array(
                    
'diez y un'       => 'once',
                    
'diez y dos'      => 'doce',
                    
'diez y tres'     => 'trece',
                    
'diez y cuatro'   => 'catorce',
                    
'diez y cinco'    => 'quince',
                    
'diez y seis'     => 'dieciseis',
                    
'diez y siete'    => 'diecisiete',
                    
'diez y ocho'     => 'dieciocho',
                    
'diez y nueve'    => 'diecinueve',
                    
'veinte y un'     => 'veintiun',
                    
'veinte y dos'    => 'veintidos',
                    
'veinte y tres'   => 'veintitres',
                    
'veinte y cuatro' => 'veinticuatro',
                    
'veinte y cinco'  => 'veinticinco',
                    
'veinte y seis'   => 'veintiseis',
                    
'veinte y siete'  => 'veintisiete',
                    
'veinte y ocho'   => 'veintiocho',
                    
'veinte y nueve'  => 'veintinueve',
                    
'ciento mil'      => 'cien mil',
                    
'un millones'     => 'un millon',
                    
'y un millon'     => 'y un millones',
                    
'millones mil'    => 'millones',
                );
                
$palabraFinal str_replace(array_keys($reemplazos), $reemplazos$palabraFinal);
                
$palabraFinal preg_replace('/^un mil[^a-z]/s''mil '$palabraFinal);
                
$palabraFinal preg_replace('/ciento$/s''cien'$palabraFinal);
                
$palabraFinal trim($palabraFinal);
            }
            return 
$palabraFinal;
        }
    }
}
saludos.
__________________
More about me...
~ @rhyudek1
~ Github
  #2 (permalink)  
Antiguo 19/07/2013, 09:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Aporte: Números a palabras

Muy bueno... lo probe con numero alto y funciona bien... seria mas simple si se pudiera crear el objeto (de pronto como singleton) y pues tuviera el metodo __toString()

Asi en vez de echo

Código PHP:
Ver original
  1. echo Khaus_Helper_Integer::num2word(891567);

Seria simplemente

Código PHP:
Ver original
  1. echo Khaus_Helper_Integer(891567);
__________________
Salu2!
  #3 (permalink)  
Antiguo 22/07/2013, 08:15
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Aporte: Números a palabras

Gracias por el comentario,

la forma de llamada se puede modificar a gusto de cada uno.
Yo en este momento lo utilizo de esta forma ya que mi idea es agregar unos cuantos métodos más dentro de la clase, así que no puedo dejar un magic method sólo para num2word(), pero es totalmente válida la modificación. es más te puedes ahorrar la orientación a objetos y dejar sólo la función.

saludos.
__________________
More about me...
~ @rhyudek1
~ Github
  #4 (permalink)  
Antiguo 22/07/2013, 09:08
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Aporte: Números a palabras

Tienes razon.... lo bueno es que no es que esa funcionalidad se use muchas veces (mas alla de que sea MUY util) asi que asi fuera 100 veces mas lento daria igual
__________________
Salu2!
  #5 (permalink)  
Antiguo 22/07/2013, 09:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Aporte: Números a palabras

@Italico76
¿Porque asumes que llamarlo de forma OOP es 100 veces más lento?
  #6 (permalink)  
Antiguo 22/07/2013, 09:32
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Aporte: Números a palabras

Cita:
Iniciado por Italico76 Ver Mensaje
Tienes razon.... lo bueno es que no es que esa funcionalidad se use muchas veces (mas alla de que sea MUY util) asi que asi fuera 100 veces mas lento daria igual
"asi que asi fuera" = tiempo condicional (no es afirmacion ni siquiera lo sugiero)

Código PHP:
Ver original
  1. if ("fuera asi"){
  2.    // Daria igual
  3. }

Solo dije que es una "funcion" que se usara esporadicamente. Se bien que no hay tanta diferencia entre usar arrays y objetos sin mucha sofisiticacion de implementacion
__________________
Salu2!

Última edición por Italico76; 22/07/2013 a las 09:59
  #7 (permalink)  
Antiguo 25/07/2013, 13:18
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Aporte: Números a palabras

Gracias por los comentarios..

La verdad depende de lo que estés programando el uso que se le dará... yo estoy con un sistema de facturación y bueno cuando se hacen resúmenes de miles de facturas quizá un segundo más o un segundo menos por la transformación a texto puede valer.

saludos :)
__________________
More about me...
~ @rhyudek1
~ Github

Etiquetas: function, numeros, palabras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 08:26.