Foros del Web » Programando para Internet » Javascript »

Puntuar los números, pero no los decimales

Estas en el tema de Puntuar los números, pero no los decimales en el foro de Javascript en Foros del Web. Hola de nuevo. Estaba intentando hacer una expresión regular para puntuar un número en formato de miles. Lo que he conseguido hasta el momento es ...
  #1 (permalink)  
Antiguo 20/02/2007, 17:41
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Puntuar los números, pero no los decimales

Hola de nuevo.

Estaba intentando hacer una expresión regular para puntuar un número en formato de miles. Lo que he conseguido hasta el momento es esto:
Código:
<script>
var re = /(\d)(?=(\d{3})+$)/g;
document.write( "1234567890".replace(re, "$1,") +"<br/>");
</script>
y el resultado es
Código:
1,234,567,890
que al parecer funciona muy bien para todos los numeros naturales, y también los negativos.

Voy a explicar un poco la expresión regular porque es complicada:
(\d) - Lo primero que buscamos es un dígito, y lo metemos entre paréntesis para almacenarlo, y utilizarlo en el replace. Ese dígito llevará detrás una coma.
(?=(\d{3})+$) - Esto es un lookahead positivo -los lookahead positivos tienen la estructura (?=...)- que lo que hace es que el (\d) de antes esté seguido de:
  1. (\d{3})+ - un grupo de tres números que aparezca una o más de una vez (+). Así conseguimos puntuar de tres en tres números.
  2. $ - El final de la cadena
En definitiva, lo que buscamos es un número seguido por un montón de números (ese montón ha de ser multiplo de 3), y después el final de la cadena.



El problema viene cuando metemos decimales en el número a formatear:
Código:
<script>
var re = /(\d)(?=(\d{3})+$)/g;
document.write( "1234567890.1234567890".replace(re, "$1,") +"<br/>");
</script>
que da como resultado
Código:
1234567890.1,234,567,890
El resultado se entiende, ya que buscamos lo que buscamos y no otra cosa. Si se analiza se comprenderá la jugada del script.


Lo he intentado solucionar con ésto: En vez de buscar el fin de la cadena, voy a buscar el fin de la cadena ó un punto:
Código:
<script>
var re = /(\d)(?=(\d{3})+($|\.))/g;
document.write( "1234567890.1234567890".replace(re, "$1,") +"<br/>");
</script>
lo que me da como resultado
Código:
1,234,567,890.1,234,567,890
es decir, me puntua tanto la parte entera como la parte decimal. Y también tiene su lógica, porque buscamos FINAL ó PUNTO.


Bueno, no he conseguido hacer que no formatee la parte decimal, necesito las lookbehind y javascript no las soporta




A ver si a algún privilegiado se le ocurre cómo hacerlo.



PD: Sí, ya sé que se puede formatear de otras maneras, y que puedo meter un IF, o descomponer el número en parte decimal y entera... etc, pero buscaba la solución con una única expresión regular, a ser posible.



Es complicadillo lo mío, síhh...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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




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