2009-06-18 11 views
12

Tengo una entrada de moneda y necesito devolver solo dígitos significativos. La entrada siempre tiene dos decimales, por lo que:corta decimales sin usar con javascript

4.00 -> 4 
4.10 -> 4.1 
4.01 -> 4.01 

Así es como estoy haciendo actualmente:

// chop off unnecessary decimals 
if (val.charAt(val.length-1) == '0') { // xx.00 
    val = val.substr(0, val.length-1); 
} 
if (val.charAt(val.length-1) == '0') { // xx.0 
    val = val.substr(0, val.length-1); 
} 
if (val.charAt(val.length-1) == '.') { // xx. 
    val = val.substr(0, val.length-1); 
} 

que trabaja, y tiene un cierto carácter directo a lo que me gusta, pero tal vez hay una manera más bonita.

Supongo que podría usar un bucle y ejecutarlo tres veces, pero parece que será al menos tan voluminoso para el momento en que condicional la instrucción if. Aparte de eso, ¿alguna idea? Imagino que hay una forma regular de hacerlo, también ...

Respuesta

14

Creo que parseFloat() hace esto.

parseFloat(4.00) // 4 
parseFloat(4.10) // 4.1 
parseFloat(4.01) // 4.01 
+1

Un flotador puede no tener suficiente precisión para representar con precisión un valor decimal dado; nunca debes usarlos para representar la moneda. –

+0

Eso es verdad. –

+0

Creo que se representarán correctamente siempre que no se realicen operaciones en ellos. Y no puede hacer operaciones en decimal en JavaScript de todos modos (sin una biblioteca decimal que use cadenas o una matriz de enteros internamente). – Nosredna

1
String(4) // "4" 
String(4.1) // "4.1" 
String(4.10) // "4.1" 
String(4.01) // "4.01" 

parseFloat funciona, pero tienes que echarlo hacia atrás en una cadena.

14

Su código también corta los ceros en números como "1000". Una mejor variante sería solo el corte de ceros que están después de un punto decimal. La sustitución básico con expresiones regulares se vería así:

str.replace(/(\.[0-9]*?)0+$/, "$1"); // remove trailing zeros 
str.replace(/\.$/, "");    // remove trailing dot 
+2

Es mejor usar 0+ en lugar de 0 * para que la expresión regular no coincida si no hay ceros finales. – llimllib

+0

Tienes razón, 0 * con cero 0s emparejados no hace nada útil. Pero al menos tampoco hace ningún daño. – sth

+0

Para los futuros investigadores: el comentario anterior ya no es relevante – Denis

2

así que usted está comenzando con una cadena y que desea una cadena resultado, es así?

val = "" + parseFloat(val); 

Eso debería funcionar. Cuanto más concisa

val = "" + +val; 

o

val = +val + ""; 

funcionaría así, sino que la forma es muy difícil de entender.

¿Cómo funcionan? Convierten la cuerda en un número y luego vuelven a una cadena. Puede que no desee utilizar estos, pero saber cómo funcionan las conversiones de JavaScript lo ayudará a depurar lo que sea que se le ocurra.

3
string to string: parseFloat(value).toFixed(2); 
string to number: +(parseFloat(value).toFixed(2)) 
number to number: Math.round(value*100)/100; 
number to string: (Math.round(value*100)/100).toFixed(2); 
0

Estoy tratando de encontrar una solución así en este momento. Así es como llegué aquí.

que utiliza la función Number() para mi aplicación, pero parece que está funcionando el mismo que parseFloat()

http://jsfiddle.net/4WN5y/

me retire y comas antes de comprobar el número.

var valueAsNumber = Number(val.replace(/\,/g,'')); 
2

creo que esto es lo que quiere

v = 33.404034 
    v.toFixed(2) # v -> 33.40 
    parseFloat(v.toFixed(2)) # 33.4 

y tiene

v = 33.00704034 
    v.toFixed(2) # v -> 33.01 
    parseFloat(v.toFixed(2)) # 33.01 

    v = 33.00304034 
    v.toFixed(2) # v -> 33.00 
    parseFloat(v.toFixed(2)) # 33 
Cuestiones relacionadas