decimales - Convertir cadena con punto o coma como separador decimal a número en JavaScript
string to html jquery (8)
De número a cadena de moneda es fácil a través de Number.prototype.toLocaleString . Sin embargo, el reverso parece ser un problema común. El separador de miles y el punto decimal no se pueden obtener en el estándar JS.
En esta pregunta en particular, el separador de miles es un espacio en blanco " "
pero en muchos casos puede ser un punto "."
y el punto decimal puede ser una coma ","
. Tal como en 1 000 000,00
o 1.000.000,00
. Entonces así es como lo convierto en un número de coma flotante apropiado.
var price = "1 000.000,99",
value = +price.replace(/(/.|/s)|(/,)/g,(m,p1,p2) => p1 ? "" : ".");
console.log(value);
Entonces, la devolución de llamada del sustituto toma "1.000.000,00"
y la convierte en "1000000.00"
. Después de eso +
en el frente de la cadena resultante lo coacciona en un número.
Esta función es bastante útil. Por ejemplo, si reemplaza la parte p1 = ""
con p1 = ","
en la función de devolución de llamada, una entrada de 1.000.000,00
resultaría en 1,000,000.00
Un elemento de entrada contiene números a donde se usa coma o punto como separador decimal y se puede usar espacio para agrupar miles como este:
''1,2''
''110 000,23''
''100 1.23''
¿Cómo podría uno convertirlos a un número flotante en el navegador usando JavaScript?
Se usan jQuery y jQuery UI. Number(string)
devuelve NaN y parseFloat()
detiene en el primer espacio o coma.
Haz un reemplazo primero:
parseFloat(str.replace('','',''.'').replace('' '',''''))
La solución perfecta
accounting.js
es una pequeña biblioteca de JavaScript para formato numérico, monetario y de dinero.
Me doy cuenta de que llego tarde a la fiesta, pero quería una solución para esto que manejara correctamente la agrupación de dígitos así como los diferentes separadores decimales para monedas. Como ninguno de estos cubrió completamente mi caso de uso, escribí mi propia solución que puede ser útil para otros:
function parsePotentiallyGroupedFloat(stringValue) {
stringValue = stringValue.trim();
var result = stringValue.replace(/[^0-9]/g, '''');
if (/[,/.]/d{2}$/.test(stringValue)) {
result = result.replace(/(/d{2})$/, ''.$1'');
}
return parseFloat(result);
}
Esto debería eliminar los dígitos que no sean dígitos y luego verificar si hubo un punto decimal (o coma) seguido de dos dígitos e insertar el punto decimal si es necesario.
Vale la pena señalar que apunté esto específicamente a la moneda y, como tal, no asume decimales o exactamente dos. Es bastante difícil estar seguro de si el primer punto decimal potencial encontrado es un punto decimal o un carácter de agrupación de dígitos (por ejemplo, 1.542
podría ser 1542
) a menos que conozca los detalles de la configuración regional actual, pero debería ser lo suficientemente fácil adaptar esto para su caso de uso específico cambiando /d{2}$
a algo que corresponda adecuadamente con lo que espera después del punto decimal.
Puede reemplazar todos los espacios por una cadena vacía, todos coma por puntos y luego analizarlos.
var str = "110 000,23";
var num = parseFloat(str.replace(//s/g, "").replace(",", "."));
console.log(num);
Usé una expresión regular en la primera para poder hacer coincidir todos los espacios, no solo el primero.
Qué pasa:
parseFloat(str.replace('' '', '''').replace(''.'', '''').replace('','', ''.''));
Todas las demás soluciones requieren que conozca el formato por adelantado. Necesitaba detectar (!) El formato en todos los casos y esto es con lo que termino.
function detectFloat(source) {
let float = accounting.unformat(source);
let posComma = source.indexOf('','');
if (posComma > -1) {
let posDot = source.indexOf(''.'');
if (posDot > -1 && posComma > posDot) {
let germanFloat = accounting.unformat(source, '','');
if (Math.abs(germanFloat) > Math.abs(float)) {
float = germanFloat;
}
} else {
// source = source.replace(/,/g, ''.'');
float = accounting.unformat(source, '','');
}
}
return float;
}
Esto fue probado con los siguientes casos:
const cases = {
"0": 0,
"10.12": 10.12,
"222.20": 222.20,
"-222.20": -222.20,
"+222,20": 222.20,
"-222,20": -222.20,
"-2.222,20": -2222.20,
"-11.111,20": -11111.20,
};
Sugerencias bienvenidas.