Estoy tratando de imprimir un número entero en JavaScript con comas como miles de separadores. Por ejemplo, quiero mostrar el número 1234567 como "1,234,567". ¿Cómo haría para hacer esto?
Así es como lo estoy haciendo:
function numberWithCommas(x) {
x = x.toString();
var pattern = /(-?\d+)(\d{3})/;
while (pattern.test(x))
x = x.replace(pattern, "$1,$2");
return x;
}
¿Hay una manera más simple o más elegante de hacerlo? Sería bueno si también funciona con flotadores, pero eso no es necesario. No es necesario que sea específico de la localidad para decidir entre puntos y comas.
javascript
formatting
numbers
Elias Zamaria
fuente
fuente
Number.prototype.toLocaleString
todavía no funciona en Safari, en 2016 . En lugar de formatear el número, simplemente lo devuelve, no arroja ningún error. Tener el mayor facepalm hoy como resultado de eso ... #goodworkAppleRespuestas:
Usé la idea de la respuesta de Kerry, pero la simplifiqué ya que solo estaba buscando algo simple para mi propósito específico. Aquí esta lo que hice:
Mostrar fragmento de código
La expresión regular utiliza 2 aserciones anticipadas:
Por ejemplo, si lo pasa
123456789.01
, la afirmación positiva coincidirá con cada punto a la izquierda del 7 (ya que789
es un múltiplo de 3 dígitos,678
es un múltiplo de 3 dígitos567
, etc.). La afirmación negativa verifica que el múltiplo de 3 dígitos no tenga ningún dígito después.789
tiene un punto después, por lo que es exactamente un múltiplo de 3 dígitos, por lo que una coma va allí.678
es un múltiplo de 3 dígitos pero tiene un9
después, por lo que esos 3 dígitos son parte de un grupo de 4 y una coma no va allí. Del mismo modo para567
.456789
es de 6 dígitos, que es un múltiplo de 3, por lo que una coma va antes de eso.345678
es un múltiplo de 3, pero tiene un9
después, por lo que no va ninguna coma. Y así. los\B
evita que la expresión regular ponga una coma al comienzo de la cadena.@ neu-rah mencionó que esta función agrega comas en lugares indeseables si hay más de 3 dígitos después del punto decimal. Si esto es un problema, puede usar esta función:
Mostrar fragmento de código
@ tjcrowder señaló que ahora que JavaScript se ha quedado atrás ( información de soporte ), se puede resolver en la propia expresión regular:
Mostrar fragmento de código
(?<!\.\d*)
es una mirada hacia atrás negativa que dice que la coincidencia no puede ir precedida de un.
cero o más dígitos. La mirada hacia atrás negativa es más rápida que la soluciónsplit
yjoin
( comparación ), al menos en V8.fuente
Me sorprende que nadie haya mencionado Number.prototype.toLocaleString . Está implementado en JavaScript 1.5 (que se introdujo en 1999), por lo que básicamente es compatible con todos los principales navegadores.
También funciona en Node.js a partir de v0.12 mediante la inclusión de Intl
Solo preste atención a que esta función devuelve una cadena, no un número.
Si quieres algo diferente, Numeral.js puede ser interesante.
fuente
var number = 123456.000; number.toLocaleString('en-US', {minimumFractionDigits: 2}); "123,456.00"
sin embargo, esas opciones no funcionan en FF o Safari.X XXX XXX,YYY
).toLocaleString
funciona en Node.js a partir de v0.12 mediante la inclusión de Intl .parseInt("1234567", 10).toLocaleString('en-US', {minimumFractionDigits: 2})
o en sunew Number("1234567").toLocaleString('en-US', {minimumFractionDigits: 2})
lugar. No funciona porque lo usas en una cadena, no en un número.⚠ Tenga en cuenta que javascript tiene un valor entero máximo de 9007199254740991
toLocaleString :
NumberFormat ( Safari no es compatible):
Por lo que verifiqué (al menos Firefox), ambos son más o menos iguales en cuanto al rendimiento.
fuente
toLocaleString
trabajos básicos en safari, opciones notoLocaleString
solución probablemente también debería incluir la configuración regional deseada, por lotoLocaleString("en")
que el patrón en inglés usa comas. Sin embargo, sitoLocaleString()
se ejecuta un indicador sin configuración regional en Francia, generará períodos en lugar de comas porque eso es lo que se usa para separar miles localmente.Sugiero usar el número_formato de phpjs.org ()
ACTUALIZACIÓN 13/02/14
La gente ha estado informando que esto no funciona como se esperaba, así que hice un JS Fiddle que incluye pruebas automatizadas.
Actualización 26/11/2017
Aquí está ese violín como un fragmento de pila con salida ligeramente modificada:
fuente
Esta es una variación de la respuesta de @ mikez302, pero modificada para admitir números con decimales (según los comentarios de @ neu-rah that numberWithCommas (12345.6789) -> "12,345.6,789" en lugar de "12,345.6789"
fuente
fuente
Usando expresión regular
Usando toLocaleString ()
ref MDN: Number.prototype.toLocaleString ()
Utilizando Intl.NumberFormat ()
ref Intl.NumberFormat
DEMO EN AQUÍ
Actuación
http://jsben.ch/sifRd
fuente
Intl.NumberFormat
Función nativa de JS. Compatible con IE11, Edge, la última versión de Safari, Chrome, Firefox, Opera, Safari en iOS y Chrome en Android.
fuente
Gracias a todos por sus respuestas. Me basé en algunas de las respuestas para hacer una solución más "única para todos".
El primer fragmento agrega una función que imita PHP 's
number_format()
al prototipo Number. Si estoy formateando un número, generalmente quiero lugares decimales para que la función tome el número de lugares decimales para mostrar. Algunos países usan comas como decimales y decimales como separador de miles, por lo que la función permite establecer estos separadores.Usarías esto de la siguiente manera:
Descubrí que a menudo necesitaba recuperar el número para operaciones matemáticas, pero parseFloat convierte 5,000 a 5, simplemente tomando la primera secuencia de valores enteros. Así que creé mi propia función de conversión flotante y la agregué al prototipo String.
Ahora puede usar ambas funciones de la siguiente manera:
fuente
var parts = this.toFixed(decimals).toString().split('.');
var dec_point
. Gracias por señalar eso.Estoy bastante impresionado por la cantidad de respuestas que tiene esta pregunta. Me gusta la respuesta de uKolka :
Pero desafortunadamente, en algunos lugares como el español, no funciona (en mi humilde opinión) como se espera para números inferiores a 10,000:
Da
1000
y no1.000
.Consulte toLocaleString que no funciona en números inferiores a 10000 en todos los navegadores para saber por qué.
Así que tuve que usar la respuesta de Elias Zamaria eligiendo el carácter separador de miles correcto:
Este funciona bien como una línea para ambos entornos locales que usan
,
o.
como separador de miles y comienza a funcionar desde 1,000 en todos los casos.Da
1.000
con un contexto local español.Si desea tener un control absoluto sobre la forma en que se formatea un número, también puede intentar lo siguiente:
Da
1,234.57
.Este no necesita una expresión regular. Funciona ajustando el número a la cantidad deseada de decimales con
toFixed
primero, luego dividiéndolo alrededor del punto decimal.
si hay uno. El lado izquierdo se convierte en una matriz de dígitos que se invierte. Luego se agrega un separador de miles cada tres dígitos desde el inicio y el resultado se invierte nuevamente. El resultado final es la unión de las dos partes. El signo del número de entrada se elimina conMath.abs
primero y luego se vuelve a colocar si es necesario.No es de una sola línea, pero no es mucho más largo y se convierte fácilmente en una función. Se han agregado variables para mayor claridad, pero esas pueden ser sustituidas por sus valores deseados si se conocen de antemano. Puede usar las expresiones que usan
toLocaleString
como una forma de encontrar los caracteres correctos para el punto decimal y el separador de miles para la localización actual (tenga en cuenta que estos requieren un Javascript más moderno).fuente
Creo que esta es la expresión regular más corta que lo hace:
Lo revisé en algunos números y funcionó.
fuente
Number.prototype.toLocaleString()
habría sido increíble si hubiera sido proporcionado de forma nativa por todos los navegadores (Safari) .Verifiqué todas las demás respuestas, pero nadie pareció llenarlo. Aquí hay un poc hacia eso, que en realidad es una combinación de las dos primeras respuestas; si
toLocaleString
funciona lo usa, si no lo hace usa una función personalizada.fuente
0.12345
saldrá0.12,345
. Se puede encontrar una buena implementación para esto en el subrayado.cadenavalue > 1000
condición if soluciona ese caso, sin embargo, esto era un problema y, por supuesto, se pueden encontrar versiones mejor probadas en otros lugares, gracias por indicarnos.value > 1000
, porque sería lo mismo para cualquier número y más de 3 decimales. Por ejemplo,1000.12345
devoluciones1,000.12,345
. Su respuesta es excelente y está en el camino correcto, pero no completa. Solo intentaba señalar a otras personas que pueden tropezar con su respuesta y simplemente copiarla / pegarla sin probar con datos de entrada diferentes.El separador de miles se puede insertar de manera internacional utilizando el
Intl
objeto del navegador :Consulte el artículo de MDN sobre NumberFormat para obtener más información; puede especificar el comportamiento de la configuración regional o el valor predeterminado del usuario. Esto es un poco más infalible porque respeta las diferencias locales; Muchos países usan puntos para separar los dígitos, mientras que una coma denota los decimales.
Intl.NumberFormat aún no está disponible en todos los navegadores, pero funciona en los últimos Chrome, Opera e IE. La próxima versión de Firefox debería ser compatible. Webkit no parece tener una línea de tiempo para la implementación.
fuente
Puede usar este procedimiento para formatear la moneda que necesita.
Para más información puedes acceder a este enlace.
https://www.justinmccandless.com/post/formatting-currency-in-javascript/
fuente
si está tratando con valores de moneda y formateando mucho, puede valer la pena agregar un pequeño Accounting.js que maneja muchos casos extremos y localización:
fuente
El siguiente código usa el escaneo de caracteres, por lo que no hay expresiones regulares.
Muestra un rendimiento prometedor: http://jsperf.com/number-formatting-with-commas/5
2015.4.26: corrección menor para resolver el problema cuando num <0. Ver https://jsfiddle.net/runsun/p5tqqvs3/
fuente
commafy(-123456)
lo que da-,123,456
Aquí hay una función simple que inserta comas para miles de separadores. Utiliza funciones de matriz en lugar de un RegEx.
Enlace CodeSandbox con ejemplos: https://codesandbox.io/s/p38k63w0vq
fuente
Utilice este código para manejar el formato de moneda para la India. El código del país se puede cambiar para manejar la moneda de otro país.
salida:
fuente
También puede usar el constructor Intl.NumberFormat . Aquí sabrás como podrás hacerlo.
fuente
Escribí este antes de tropezar con esta publicación. Sin expresiones regulares y realmente puedes entender el código.
fuente
EDITAR: la función solo funciona con un número positivo. por ejemplo:
Salida: "123,123,231,232"
Pero responder el
toLocaleString()
método de la pregunta anterior solo resuelve el problema.Salida: "123,123,231,232"
¡Animar!
fuente
Mi respuesta es la única respuesta que reemplaza completamente a jQuery con una alternativa mucho más sensata:
Esta solución no solo agrega comas, sino que también se redondea al centavo más cercano en caso de que ingrese una cantidad como la
$(1000.9999)
que obtendrá $ 1,001.00. Además, el valor que ingrese puede ser un número o una cadena; No importa.Si está tratando con dinero, pero no desea que se muestre un signo de dólar principal en la cantidad, también puede agregar esta función, que usa la función anterior pero elimina el
$
:Si estás no se trata de dinero, y tienen diferentes requisitos de formato decimal, he aquí una función más versátil:
Ah, y por cierto, el hecho de que este código no funcione en alguna versión antigua de Internet Explorer es completamente intencional. Intento romper IE en cualquier momento que pueda detectar que no es compatible con los estándares modernos.
Recuerde que el elogio excesivo, en la sección de comentarios, se considera fuera de tema. En cambio, solo colócame con votos positivos.
fuente
Para mí, la mejor respuesta es usar toLocaleString como dijeron algunos miembros. Si desea incluir el símbolo '$' simplemente agregue las opciones de idioma y tipo. Aquí hay un ejemplo para formatear un número a pesos mexicanos
atajo
fuente
Déjame intentar mejorar la respuesta de uKolka y tal vez ayudar a otros a ahorrar algo de tiempo.
Use Numeral.js .
Debe usar Number.prototype.toLocaleString () solo si la compatibilidad de su navegador no es un problema.
fuente
Una forma alternativa, soportando decimales, diferentes separadores y negativos.
Algunas correcciones de @Jignesh Sanghani, no olviden votar su comentario.
fuente
fn.substr(0, i)
reemplazar conn.substr(0, i)
y tambiénnumber.toFixed(dp).split('.')[1]
reemplazar conparseFloat(number).toFixed(dp).split('.')[1]
. porque cuando lo uso directamente me da un error. por favor actualice su códigoCreo que esta función se ocupará de todos los problemas relacionados con este problema.
fuente
Solo para futuros Googlers (o no necesariamente 'Googlers'):
Todas las soluciones mencionadas anteriormente son maravillosas, sin embargo, RegExp podría ser muy malo para usar en una situación como esa.
Entonces, sí, puede usar algunas de las opciones propuestas o incluso escribir algo primitivo pero útil como:
La expresión regular que se usa aquí es bastante simple y el ciclo irá exactamente la cantidad de veces que se necesita para hacer el trabajo.
Y puede optimizarlo mucho mejor, código "DRYify", etc.
Todavía,
(en la mayoría de las situaciones) sería una opción mucho mejor.
El punto no está en la velocidad de ejecución o en la compatibilidad entre navegadores.
En situaciones en las que desea mostrar el número resultante al usuario, el método .toLocaleString () le brinda superpoderes para hablar el mismo idioma con el usuario de su sitio web o aplicación (cualquiera que sea su idioma).
Este método de acuerdo con la documentación de ECMAScript se introdujo en 1999, y creo que la razón fue la esperanza de que Internet en algún momento conecte a personas de todo el mundo, por lo que se necesitaban algunas herramientas de "internalización".
Hoy Internet nos conecta a todos, por lo tanto, es importante recordar que el mundo es mucho más complejo de lo que podríamos imaginar y que (/ casi) todos estamos aquí , en Internet.
Obviamente, teniendo en cuenta la diversidad de personas, es imposible garantizar una experiencia de usuario perfecta para todos porque hablamos diferentes idiomas, valoramos cosas diferentes, etc. Y exactamente por esto, es aún más importante tratar de localizar las cosas tanto como sea posible. .
Entonces, teniendo en cuenta que hay algunos estándares particulares para la representación de fecha, hora, números, etc. y que tenemos una herramienta para mostrar esas cosas en el formato preferido por el usuario final, no es tan raro y casi irresponsable no hacerlo. utilizar esa herramienta (especialmente en situaciones en las que queremos mostrar estos datos al usuario)
Para mí, usar RegExp en lugar de .toLocaleString () en una situación como esa suena un poco como crear una aplicación de reloj con JavaScript y codificarlo de tal manera que muestre solo la hora de Praga (lo cual sería bastante inútil para personas que no viven en Praga) a pesar de que el comportamiento predeterminado de
es devolver los datos de acuerdo con el reloj del usuario final.
fuente
Mi solución " verdadera " de expresiones regulares solo para esos fanáticos
¿Ves a esos entusiastas jugadores arriba? Tal vez puedas jugar golf. Aquí está mi derrame cerebral.
Utiliza un
ESPACIO DELGADO (U + 2009) para un separador de miles, como dijo el Sistema Internacional de Unidades en la octava edición (2006) de su publicación " Folleto SI: El Sistema Internacional de Unidades (SI) " (Ver §5.3 .4.) La novena edición (2019) sugiere utilizar un espacio para ello (Ver §5.4.4.). Puede usar lo que quiera, incluida una coma.
Ver.
¿Como funciona?
Para una parte entera
.replace(……, " I ")
Poner "yo"/……/g
en cada uno de\B
el intermedio de dos dígitos adyacentes(?=……)
LOOKAHEAD POSITIVO cuya parte correcta es(\d{3})+
uno o más fragmentos de tres dígitos\b
seguido de un no dígito, como un punto, el final de la cadena, etc.(?<!……)
MIRADA NEGATIVA DETRÁS excluyendo aquellos cuya parte izquierda\.\d+
es un punto seguido de dígitos ("tiene un separador decimal").Para una parte decimal
.replace(……, " F ")
Poner "F"/……/g
en cada uno de\B
el intermedio de dos dígitos adyacentes(?<=……)
MIRADA POSITIVA DETRÁS cuya parte izquierda es\.
un separador decimal(\d{3})+
seguido de uno o más fragmentos de tres dígitos.Clases de personajes y límites
Compatibilidad del navegador
fuente
Agregué tofixed a la solución de Aki143S . Esta solución utiliza puntos para miles de separadores y comas para la precisión.
Ejemplos;
fuente
Muchas buenas respuestas ya. Aquí hay otro, solo por diversión:
Algunos ejemplos:
fuente
format(-123456)
lo que da-,123,456