2009-06-18 10 views
12

Mam dane wejściowe waluty i muszę zwrócić tylko znaczące cyfry. Wejście zawsze ma dwa miejsca po przecinku, więc:posiekaj nieużywane miejsca dziesiętne z javascript

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

Oto jak jestem obecnie robi to:

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

który działa i ma pewną bezpośredniość o to, że ja niby podobne, ale może jest ładniejsza droga.

Przypuszczam, że mógłbym użyć pętli i przejść przez nią trzy razy, ale to wydaje się, że będzie co najmniej tak nieporęczne, gdy warunkuję instrukcję if. Poza tym, wszelkie pomysły? Wyobrażam sobie, że jest to również sposób na wyrenderowanie ....

Odpowiedz

14

Wierzę, że robi to parseFloat().

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

Pływak może nie mieć wystarczającej precyzji dokładnie reprezentować daną wartość dziesiętną; nigdy nie należy ich używać do reprezentowania waluty. –

+0

To prawda. –

+0

Myślę, że będą one reprezentowane poprawnie, o ile nie wykonasz na nich żadnych operacji. Nie można również wykonywać operacji dziesiętnych w JavaScript (bez biblioteki dziesiętnej, która używa łańcuchów lub tablicy liczb całkowitych wewnętrznie). – Nosredna

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

parseFloat działa, ale musisz oddać go z powrotem do łańcucha.

14

Twój kod również zeruje zera w liczbach takich jak "1000". Lepszym wariantem byłoby tylko siekanie zer po kropce dziesiętnej. Podstawowy zamiennik wyrażeniami regularnymi będzie wyglądał następująco:

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

Lepiej używać 0+ zamiast 0 *, więc wyrażenie regularne nie pasuje, jeśli nie ma zer końcowych. – llimllib

+0

Masz rację, 0 * przy zerowym zera 0s nie robi nic użytecznego. Ale przynajmniej nie szkodzi. – sth

+0

Dla przyszłych naukowców: poprzedni komentarz nie jest już odpowiedni – Denis

2

Zaczynasz od napisu i chcesz uzyskać ciąg znaków, czy tak?

val = "" + parseFloat(val); 

To powinno zadziałać. Im bardziej lakoniczny

val = "" + +val; 

lub

val = +val + ""; 

będzie działać jak dobrze, ale forma jest zbyt trudne do zrozumienia.

Jak to działa? Przekształcają ciąg na liczbę, a następnie na ciąg znaków. Możesz nie chcieć ich używać, ale wiedza o tym, jak działają konwersje JavaScript, pomoże ci w debugowaniu wszystkiego, co wymyślisz.

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

Próbuję znaleźć takie rozwiązanie w tej chwili. Oto jak się tu dostałem.

użyłem numer funkcji() dla mojej aplikacji, ale wygląda na to, że to działa tak samo jak parseFloat()

http://jsfiddle.net/4WN5y/

usunąć i przecinki przed sprawdzeniem numeru.

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

myślę, że to, co chcesz

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

i masz

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 
Powiązane problemy