parsedecimal - round javascript
javascript parseFloat ''500,000'' devuelve 500 cuando necesito 500000 (7)
¿Qué pasa con una función simple para resolver la mayoría de los problemas comunes?
function getValue(obj) {
Value = parseFloat( $(obj).val().replace(/,/g,'''') ).toFixed(2);
return +Value;
}
La función anterior obtiene valores de los campos (usando jQuery) suponiendo que los valores ingresados son numéricos (prefiero validar los campos mientras el usuario ingresa datos, así que sé con seguridad que el contenido del campo es numérico).
En el caso de valores de coma flotante, si está bien formateado en el campo, la función devolverá un valor de punto flotante correctamente.
Esta función está lejos de completarse, pero soluciona rápidamente el problema " , " ( coma ) para los valores ingresados como 1,234.56 o 1,234,567. Devolverá un número válido siempre que el contenido sea numérico.
El signo + ( más ) delante de la variable Valor en el comando de devolución es un " truco sucio " utilizado en JavaScript para asegurar que el contenido de la variable devuelto sea numérico .
es fácil modificar la función para otros fines, como (por ejemplo), convertir cadenas a valores numéricos teniendo en cuenta el problema " , " ( coma ):
function parseValue(str) {
Value = parseFloat( str.replace(/,/g,'''') ).toFixed(2);
return +Value;
}
Ambas operaciones pueden incluso combinarse en una función. Es decir:
function parseNumber(item,isField=false) {
Value = (isField) ? parseFloat( $(item).val().replace(/,/g,'''') ).toFixed(2) : parseFloat( item.replace(/,/g,'''') ).toFixed(2)
return +Value;
}
En tal caso, si la función se llama result = parseNumber (''12, 092.98 ''); Analizará el valor ya que es una Cadena. Pero si se llama como result = parseNumber (''# MyField'', true); intentará obtener el valor de ''#MyField'' .
Como dije antes, tales funciones están lejos de ser completas y pueden expandirse de muchas maneras. Una idea es verificar el primer carácter del parámetro dado (cadena) y decidir basado en el formato de cadena donde obtener el valor a analizar (si el 1er carácter es = ''#'' entonces es una ID de un objeto DOM, de lo contrario , si comienza con un número, debe ser una cadena para analizar).
Pruébalo ... Feliz codificación.
¿Cómo sería una buena forma de manejar esto?
Ya pensé en quitar la coma y luego en analizar para flotar.
¿Conoces una manera mejor / más limpia?
Gracias
Basándose en la idea de @kennebec, si quiere asegurarse de que las comas son correctas y no desea reemplazar las comas, podría intentar algo como esto:
function myParse(num) {
var n2 = num.split(",")
out = 0
for(var i = 0; i < n2.length; i++) {
out *= 1000;
out += parseFloat(n2[i])
}
return out
}
alert(myParse("1,432,85"));
// Returns 1432085, as the comma is misplaced.
Puede que no sea tan rápido, pero querías alternativas :)
No sé por qué nadie ha sugerido esta expresión-
parseFloat( theString.replace(/[^/d/.]/g,'''') );
Elimina cualquier carácter no numérico excepto por puntos. No necesita funciones / bucles personalizados para esto tampoco, eso es exagerado.
No tengo suficiente reputación para agregar un comentario, pero para cualquiera que se pregunte sobre el rendimiento de regex vs split / join, aquí hay un violín rápido: https://jsfiddle.net/uh3mmgru/
var test = "1,123,214.19";
var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
var a = parseFloat(test.replace(/,/g,''''));
}
var t1 = performance.now();
document.write(''Regex took: '' + (t1 - t0) + '' ms'');
document.write(''<br>'')
var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
var b = parseFloat(test.split('','').join(''''));
}
var t1 = performance.now();
document.write(''Split/join took: '' + (t1 - t0) + '' ms'');
Los resultados que obtengo son (para 1 millón de bucles cada uno):
Regex: 263.335 ms
Dividir / unir: 1035.875 ms
Así que creo que es seguro decir que la expresión regular es el camino a seguir en este escenario
Nop. Quita la coma
Puede usar el método de reemplazo de cadena, pero no en un trazador de líneas como lo permite una expresión regular.
while(str.indexOf('','')!=-1)str= str.replace('','','''');
parseFloat(str);
O para hacer una sola expresión sin una expresión regular =
return parseFloat(str.split('','').join(''''));
Yo usaría la expresión regular.
parseFloat( theString.replace(/,/g,'''') );