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.
Usando el objeto Int.NumberFormat podías hacer lo siguiente:
locale
del que se quiere obtener el número.locale
.locale
por punto.parseFloat
a la cadena resultante.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])
$.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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP