2009-06-18 1 views
12

У меня есть ввод валюты и вам нужно вернуть только значимые цифры. Вход всегда имеет два знака после запятой, так:chop unused decimals с javascript

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

Вот как я сейчас делаю это:

// 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); 
} 

, который работает, и имеет определенную прямолинейность ему, что я вроде как, но может быть, лучше.

Я полагаю, что я мог бы использовать цикл и пропустить его три раза, но на самом деле кажется, что он будет по крайней мере столь же громоздким к тому моменту, когда я установлю условие if. Кроме этого, любые идеи? Я предполагаю, что есть способ регулярного выражения, это тоже ....

ответ

14

Я считаю parseFloat() делает это.

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

Поплавок может не иметь достаточной точности, чтобы точно представлять заданное значение десятичного; вы не должны использовать их для представления валюты. –

+0

Это правда. –

+0

Я думаю, что они будут представлены правильно, если вы не выполняете на них операции. И вы не можете делать операции в десятичном формате в JavaScript так или иначе (без десятичной библиотеки, которая использует строки или массив целых чисел внутри). – Nosredna

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

parseFloat работает, но вы должны бросить его обратно в строку.

14

Ваш код также отрубает нули в цифрах типа «1000». Лучшим вариантом было бы только нарезать нули, которые после десятичной точки. Основная замена с использованием регулярных выражений будет выглядеть следующим образом:

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

Лучше использовать 0+ вместо 0 *, поэтому регулярное выражение не совпадает, если нет нулевых нулей. – llimllib

+0

Вы правы, 0 * с нулевым совпадением 0s не делает ничего полезного. Но, по крайней мере, это тоже не наносит вреда. – sth

+0

Для будущих исследователей: предыдущий комментарий больше не уместен – Denis

2

Итак, вы начинаете со строкой, и вы хотите строковый результат, верно?

val = "" + parseFloat(val); 

Это должно сработать. Более лаконична

val = "" + +val; 

или

val = +val + ""; 

будет работать так же хорошо, но эта форма слишком трудно понять.

Как это работает? Они преобразуют строку в число, а затем обратно в строку. Возможно, вы не захотите их использовать, но зная, как работают JavaScript-преобразования, вы сможете отлаживать все, что вы придумали.

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

Я пытаюсь найти такое решение прямо сейчас. Вот как я сюда попал.

Я использовал функцию Number() для моего приложения, но похоже, что он работает так же, как parseFloat()

http://jsfiddle.net/4WN5y/

я удаляю и запятые перед проверкой номеров.

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

Я думаю, что это то, что вы хотите

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

и у вас есть

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 

 Смежные вопросы

  • Нет связанных вопросов^_^