TransWikia.com

Javascript - Formatear un número en string local a number

Stack Overflow en español Asked by Leonardo Cavani on December 25, 2021

¿Hay alguna forma de parsear "1.100" (1100 en España) a 1100?

Por supuesto, parseInt devuelve 1, no sabe que es un número en español.

Intl.NumberFormat("es-Es").format(number);
returns "1.1"

Podría hacer un par de funciones para cambiar el "#.###" por "#,###", es decir, todos los puntos por comas, pero me gustaría saber si ya existe algún método nativo más sencillo.

3 Answers

Usando el objeto Int.NumberFormat podías hacer lo siguiente:

  • Buscar el separador decimal para el locale del que se quiere obtener el número.
  • Reemplazar todo lo que sea distinto de números, signo negativo y el separador decimal de dicho locale.
  • Reemplazar el separador decimal de dicho locale por punto.
  • Aplicar parseFloat a la cadena resultante.

Ejemplo:

function numberParser(value, locale) {
  // Obtenemos un numero formateado para descubrir el separador decimal
  let number = Intl.NumberFormat(locale).format(.1),
    // Obtenemos el separador decimal
    decimalSep = number[1],
    // Creamos el patrón para dejar solo números, signo negativo y el sep. decimal
    pattern = new RegExp('[^-0-9' + decimalSep + ']', 'g'),
    // Buscamos cuantos separadores decimales tiene
    matchs = value.match(new RegExp('['+decimalSep+']', 'g'));

  // [OPCIONAL] Validamos que si tiene separador decimal, no sea mas de uno
  if (matchs && matchs.length > 1) return NaN;

  // Limpiamos y reemplazamos el sep. decimal por punto
  number = value.replace(pattern, '').replace(decimalSep, '.');
  return parseFloat(number);
}

let number = '1.100';
console.log('EN: ', numberParser(number, 'en'));
console.log('ES: ', numberParser(number, 'es'));

number = '-1.000.100,20';
console.log('EN: ', numberParser(number, 'en'));
console.log('ES: ', numberParser(number, 'es'));

Answered by Marcos on December 25, 2021

Podrías usar Globalize

Una biblioteca de JavaScript para internacionalización y localización que aprovecha los datos oficiales de Unicode CLDR JSON. La biblioteca funciona tanto para el navegador como en Node.js.

Puntualmente la función .numberParser([options])

Ejemplo:

$.when(
    $.getJSON('https://raw.githubusercontent.com/unicode-cldr/cldr-numbers-full/master/main/es/numbers.json'),
    $.getJSON('https://raw.githubusercontent.com/unicode-cldr/cldr-numbers-full/master/main/en/numbers.json'),
    $.getJSON('https://raw.githubusercontent.com/unicode-cldr/cldr-core/master/supplemental/likelySubtags.json')
  )
  .then(function() {
    // Formateamos las respuestas
    return [].slice.apply(arguments, [0]).map(function(result) {
      return result[0];
    });
  })
  .then(Globalize.load)
  .then(() => {
    var enParser = Globalize("en").numberParser(),
      esParser = Globalize("es").numberParser(),
      number = '1.100';

    console.log('EN: ', enParser(number));
    console.log('ES: ', esParser(number));
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cldrjs/0.5.1/cldr.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cldrjs/0.5.1/cldr/event.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/globalize/1.5.0/globalize.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/globalize/1.5.0/globalize/number.min.js"></script>

Answered by Marcos on December 25, 2021

La función parseInt no soporta separadores de miles, puedes considerar que simplemente parará al primer caracter que no sea un número.1

Lo que generalmente puedes hacer es eliminar los separadores de miles, por ejemplo con la función replace.

function demostrar() {
  var sa = "1.100";
  var a = parseInt(sa) + "<br>"                      //tal como está
        +  parseInt(sa.replace('.', ',')) + "<br>"   //sustituyendo el separador de miles . por ,
        +  parseInt(sa.replace('.', '')) + "<br>";   //eliminando el separador de miles
  
  var b = parseInt("10.00") + "<br>";
  var c = parseInt("10.33") + "<br>";
  var d = parseInt("34 45 66") + "<br>";
  var e = parseInt("   60   ") + "<br>";
  var f = parseInt("40 años") + "<br>";
  var g = parseInt("Él tiene 40") + "<br>";

  var h = parseInt("10", 10)+ "<br>";
  var i = parseInt("010")+ "<br>";
  var j = parseInt("10", 8)+ "<br>";
  var k = parseInt("0x10")+ "<br>";
  var l = parseInt("10", 16)+ "<br>";

  var n = a + b + c + d + e + f + g + "<br>" + h + i + j + k +l;
  document.getElementById("demo").innerHTML = n;
}
<p>Haz clic en el botón para probar el código</p>

<button onclick="demostrar()">¡Probemos!</button>

<p id="demo"></p>

He dejado otros ejemplos, obtenidos de parseInt en w3schools porque me parecieron educativos.

Si te fijas en los primeros valores, solamente la eliminación del separador de miles da el resultado que esperas.


1En realidad es algo un poco más complejo, pues parseInt soporta espacios al inicio del número y números hexadecimales, que inician con "0x" y tienen dígitos como A, B, C, etc.

Answered by jachguate on December 25, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP