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:
y el resultado es <script> var re = /(\d)(?=(\d{3})+$)/g; document.write( "1234567890".replace(re, "$1,") +"<br/>"); </script>
Código:
que al parecer funciona muy bien para todos los numeros naturales, y también los negativos.1,234,567,890
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:
- (\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.
- $ - El final de la cadena
El problema viene cuando metemos decimales en el número a formatear:
Código:
que da como resultado <script> var re = /(\d)(?=(\d{3})+$)/g; document.write( "1234567890.1234567890".replace(re, "$1,") +"<br/>"); </script>
Código:
El resultado se entiende, ya que buscamos lo que buscamos y no otra cosa. Si se analiza se comprenderá la jugada del script.1234567890.1,234,567,890
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:
lo que me da como resultado <script> var re = /(\d)(?=(\d{3})+($|\.))/g; document.write( "1234567890.1234567890".replace(re, "$1,") +"<br/>"); </script>
Código:
es decir, me puntua tanto la parte entera como la parte decimal. Y también tiene su lógica, porque buscamos FINAL ó PUNTO.1,234,567,890.1,234,567,890
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...