Ver Mensaje Individual
  #15 (permalink)  
Antiguo 07/01/2007, 19:59
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 4 meses
Puntos: 45
Re: Sumar decimales

A ver si os gusta el lío ilegible que me he montado para hacer el script rápido, confuso, y de pocas líneas :

Código PHP:
var nos=["4.532,234","55,56002","541.867,078"];

function 
formato_PC(n) {
    return 
Numbern.replace(/./g,"").replace(/,/g,".") );
}
function 
formato_HUM(n) {
    
n=String(n).split(".");        //el entero es n[0] y la parte decimal es n[1]
    
n[0]=n[0].split("").reverse().join("");        //le damos la vuelta, asi podemos tocarlo desde atras sin complicaciones
    
n[0]=n[0].replace(/(d{3})(?=d)/g,"$1.");        
    
//ver comentario abajo
    
n[0]=n[0].split("").reverse().join("");        //lo reestablecemos a su orden original
    
return n.join(",");        //unimos la parte entera con la decimal
}

function 
suma(arr) {
    var 
total=0;
    for(var 
i=0;i<arr.length;i++)
        
total+=formato_PC(arr[i]);
    return 
formato_HUM(total);
}

document.writesuma(nos) ); 
El comentario es:
coincide con 3 digitos seguidos solo si estan seguidos de otro digito y lo sustituímos por los tres digitos con un punto (evitamos el punto al final de la cadena. Ejemplo: Si el numero original es 123456, al darle la vuelta sera 654321: buscamos ocurrencias de 3 numeros solo si estan seguidas de otro numero, es decir, encontramos 654 porque le sigue un 3, y no encontramos 321 porque no hay ningun numero detras, evitando como resultado "654.321." que al hacer el reverse seria ".123.456" y no "123.456"
Lo que se traduciría en nuestra página si alguien quiere por:

Código PHP:
var nos=["4.532,234","55,56002","541.867,078"];

function 
suma(arr) {
    for(var 
i=0total=0i<arr.lengthi++) 
        
total+=Numberarr[i].replace(/./g,"").replace(/,/g,".") );
    
total=String(total).split(".");    
    
total[0]=total[0].split("").reverse().join("").replace(/(d{3})(?=d)/g,"$1.").split("").reverse().join("");
    return 
total.join(",");
}

document.writesuma(nos) ); 
5 líneas dentro de nuestra función.



AVISO: Todas las letras d dentro de las expresiones regulares tienen una contrabarra delante suyo, el sistema del foro impide que salgan. Son \d todas.
total[0]=total[0].split("").reverse().join("").replace(/(\d{3})(?=\d)/g,"$1.").split("").reverse().join("");


Editado: : Se me olvidó decir que hay una contrabarra delante del punto que el sistema del foro tampoco muestra, es:
total+=Number( arr[i].replace(/\./g,"").replace(/\,/g,".") );


Que nadie se mosquee, sólo me aburro un poco y quería ponerme como reto personal reducir un poco el script y acordarme de las expresiones regulares. Pero me ha quedado elegante, ¿no? La potencia de las expresiones regulares...

Un saludo a todos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.

Última edición por derkenuke; 16/01/2007 a las 15:41