Agregue comas a los números cada tres dígitos


160

¿Cómo puedo formatear números usando un separador de coma cada tres dígitos usando jQuery?

Por ejemplo:

╔═══════════╦═════════════╗
║   Input   ║   Output    ║
╠═══════════╬═════════════╣
║       298 ║         298 ║
║      2984 ║       2,984 ║
║ 297312984 ║ 297,312,984 ║
╚═══════════╩═════════════╝

Soy nuevo en jQuery y me gustaría una función / complemento simple que solo agregue comas después de cada tres dígitos si los números tienen más de tres dígitos. Solo números positivos, sin fracciones, sin decimales, sin moneda involucrada, y el formato estándar de EE. UU. (1,111) no ($ 1,111 o $ 1,111.11). Preferiría haber terminado de usar jQuery y no solo javascript si es posible, y sería bueno establecer el conjunto de códigos en una función para que se pueda aplicar muy fácilmente. ¿Cómo hago para hacer eso? Apreciar la aportación de todos. Gracias de nuevo.
Steve

2
@unknown: ya tienes muchas respuestas. Mira las respuestas que has recibido y evalúalas para ver cuál es la mejor para ti. Si necesita más aclaraciones para una de las respuestas, publíquela como un comentario a esa respuesta.
Mark Byers

1
Lo siento, mi pregunta no fue lo suficientemente concisa, pero vea el formato del complemento Doug Neiner usando el código de Paul Creasey para la respuesta.
Steve

Respuestas:


241

@Paul Creasey tenía la solución más simple como regex, pero aquí está como un simple complemento jQuery:

$.fn.digits = function(){ 
    return this.each(function(){ 
        $(this).text( $(this).text().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") ); 
    })
}

Entonces podría usarlo así:

$("span.numbers").digits();

44
¡Funciona perfectamente! Gracias a Paul Creasey por un código simple y elegante y gracias a Doug Neiner por ponerlo en formato de complemento. Crédito otorgado a ambos.
Steve

44
RC @ Mark Byers La sintaxis es correcta. '999.9999'.replace (/ (\ d) (? = (\ D \ d \ d) + (?! \ D)) / g, "$ 1,") devuelve' 999.9,999 'sin embargo.
bendewey

66
Hecho un ligero mod para campos de entrada:$.fn.digits = function(){ return this.each(function(){ $(this).val( $(this).val().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") ); }) }
mpemburn

3
Creo que esto sería más adecuado para una función de estilo de utilidad con espacio de nombre jQuery, por ejemplo $.digits = function() { ... };.
alex

63
La forma más rápida esnumber.toLocaleString("en");
Derek 朕 會 功夫

95

Podrías usar Number.toLocaleString():

var number = 1557564534;
document.body.innerHTML = number.toLocaleString();
// 1,557,564,534


Lo he intentado, pero no estoy trabajando en el servidor en vivo, pero estoy trabajando en localhost ..
Abed Putra

1
@eladsilver w3schools.com/jsref/jsref_tolocalestring.asp en todos los navegadores
ricks

Esto funcionó más fácil para mí. Necesitaba moneda y comas. También pude establecer propiedades: var n = 26787.89 var myObjCurrency = { style: "currency", currency: "USD", currencyDisplay : "symbol" } n.toLocaleString("en-US", myObjCurrency));
AWP

78

Algo como esto si te gusta la expresión regular, ¡no estás seguro de la sintaxis exacta para el reemplazo aunque!

MyNumberAsString.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");

2
La sintaxis es correcta. '999.9999'.replace (/ (\ d) (? = (\ D \ d \ d) + (?! \ D)) / g, "$ 1,") devuelve' 999.9,999 'sin embargo.
Mark Byers

@ Desconocido, lo moví a una respuesta. Está más abajo en esta página con un ejemplo de uso.
Doug Neiner el

27

Podrías probar NumberFormatter .

$(this).format({format:"#,###.00", locale:"us"});

También es compatible con diferentes configuraciones regionales, incluido, por supuesto, EE. UU.

Aquí hay un ejemplo muy simplificado de cómo usarlo:

<html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript" src="jquery.numberformatter.js"></script>
        <script>
        $(document).ready(function() {
            $(".numbers").each(function() {
                $(this).format({format:"#,###", locale:"us"});
            });
        });
        </script>
    </head>
    <body>
        <div class="numbers">1000</div>
        <div class="numbers">2000000</div>
    </body>
</html>

Salida:

1,000
2,000,000

Eché un vistazo a este complemento y, según la descripción del autor, estaba destinado a usarse en campos de entrada de formulario. ¿Cómo puedo adoptarlo para aplicarlo a <abarcan clase = "números"> 2984 </span> para que se formatee a <abarcan clase = "números"> 2,984 </span> sin decimales. Intenté $ ('span.numbers'). Format ({format: "#, ###", locale: "us"}); Pero no pasó nada. Todavía estoy examinando el complemento, jugando con él. Lo siento, soy un novato de jQuery :-)
Steve

+1 Genial saber sobre este complemento. Estoy de acuerdo en que para el crecimiento y la internacionalización futura, esta sería la mejor ruta a seguir.
Doug Neiner el

Aquí está el enlace a su repositorio de GitHub. github.com/hardhub/jquery-numberformatter
Mwangi Thiga

22

Esto no es jQuery, pero funciona para mí. Tomado de este sitio .

function addCommas(nStr) {
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

1
Muy "raíces" de ti :)
MonoThreaded

"Rootsy" puede ser, pero no creo que los otros enfoques sofisticados hubieran funcionado en mi situación, donde los datos están incrustados en un Canvas (Chart.JS). Pero agregar esa función y llamarla en el evento afterDraw () del gráfico funciona perfectamente: ctx.fillText (addCommas (dataset.data [i]),
B. Clay Shannon el

Esto no funciona, por ejemplo, 3000000 (7 dígitos). ¡solo para 6 y menos dígitos!
Mostafa Norzade

21

Use la función Número ();

$(function() {

  var price1 = 1000;
  var price2 = 500000;
  var price3 = 15245000;

  $("span#s1").html(Number(price1).toLocaleString('en'));
  $("span#s2").html(Number(price2).toLocaleString('en'));
  $("span#s3").html(Number(price3).toLocaleString('en'));

  console.log(Number(price).toLocaleString('en'));

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<span id="s1"></span><br />
<span id="s2"></span><br />
<span id="s3"></span><br />


Gracias, usé tu respuesta. Vale la pena señalar que esto solo admite números de hasta 15 dígitos de longitud.
tallpaul

21

Respuesta 2016:

Javascript tiene esta función, por lo que no necesita Jquery.

yournumber.toLocaleString("en");

2
¿Funcionará en todos los navegadores? Está funcionando bien en cromo. ¿Funcionará en IE9 + y opera, safari?
zepelín

@zeppelin w3schools.com/jsref/jsref_tolocalestring.asp es compatible con todos los navegadores
ricks

1
Solo asegúrese de que el número al que lo llama sea un tipo de número (int, float, etc.) y no una cadena.
el3ati2

16

Una solución más completa

El núcleo de esto es la replacellamada. Hasta ahora, no creo que ninguna de las soluciones propuestas maneje todos los siguientes casos:

  • Enteros: 1000 => '1,000'
  • Instrumentos de cuerda: '1000' => '1,000'
  • Para cuerdas:
    • Conserva ceros después del decimal: 10000.00 => '10,000.00'
    • Descarta los ceros a la izquierda antes del decimal: '01000.00 => '1,000.00'
    • No agrega comas después del decimal: '1000.00000' => '1,000.00000'
    • Conservas principales -o +:'-1000.0000' => '-1,000.000'
    • Devuelve, sin modificar, cadenas que no contienen dígitos: '1000k' => '1000k'

La siguiente función hace todo lo anterior.

addCommas = function(input){
  // If the regex doesn't match, `replace` returns the string unmodified
  return (input.toString()).replace(
    // Each parentheses group (or 'capture') in this regex becomes an argument 
    // to the function; in this case, every argument after 'match'
    /^([-+]?)(0?)(\d+)(.?)(\d+)$/g, function(match, sign, zeros, before, decimal, after) {

      // Less obtrusive than adding 'reverse' method on all strings
      var reverseString = function(string) { return string.split('').reverse().join(''); };

      // Insert commas every three characters from the right
      var insertCommas  = function(string) { 

        // Reverse, because it's easier to do things from the left
        var reversed           = reverseString(string);

        // Add commas every three characters
        var reversedWithCommas = reversed.match(/.{1,3}/g).join(',');

        // Reverse again (back to normal)
        return reverseString(reversedWithCommas);
      };

      // If there was no decimal, the last capture grabs the final digit, so
      // we have to put it back together with the 'before' substring
      return sign + (decimal ? insertCommas(before) + decimal + after : insertCommas(before + after));
    }
  );
};

Puede usarlo en un complemento jQuery como este:

$.fn.addCommas = function() {
  $(this).each(function(){
    $(this).text(addCommas($(this).text()));
  });
};

9

También puede consultar el complemento jquery FormatCurrency (del cual soy el autor); también tiene soporte para múltiples configuraciones regionales, pero puede tener la sobrecarga del soporte de divisas que no necesita.

$(this).formatCurrency({ symbol: '', roundToDecimalPlace: 0 });

44
esta pregunta me modificó para lanzar v1.3 de este complemento, así que gracias
bendewey

3

Aquí está mi javascript, probado solo en Firefox y Chrome

<html>
<header>
<script>
    function addCommas(str){
        return str.replace(/^0+/, '').replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }

    function test(){
        var val = document.getElementById('test').value;
        document.getElementById('test').value = addCommas(val);
    }
</script>
</header>
<body>
<input id="test" onkeyup="test();">
</body>
</html>

1

La forma muy fácil es usar la toLocaleString()función

tot = Rs.1402598 //Result : Rs.1402598

tot.toLocaleString() //Result : Rs.1,402,598

1
function formatNumberCapture () {
$('#input_id').on('keyup', function () {
    $(this).val(function(index, value) {
        return value
            .replace(/\D/g, "")
            .replace(/\B(?=(\d{3})+(?!\d))/g, ",")
            ;
    });
});

Puedes probar esto, me funciona

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.