2009-09-08 14 views
8

Mam pytanie dotyczące funkcji FIXed(). Jeśli mam float np. - 3.123123423 i . Jak mogę wyprowadzić go do pola wejściowego za pomocą opcji ToFixed (2), aby wartości wejściowe były następujące: 3.12 i . To znaczy, jeśli wartość jest liczbą całkowitą Chcę wyjście bez spływu .00 :)Javascript toFixed function

+2

Możesz chcieć określić, co chcesz zrobić dla wersji 3.1 i 3.005. – Mark

+0

jak o 'parseFloat ((wartość) .toFixed (2))' –

Odpowiedz

11

Ponieważ nie ma żadnej różnicy między całkowitymi i pływa w JavaScripcie, tutaj jest moje podejście quick'n'dirty:

theNumber.toFixed(2).replace(".00", ""); 

Albo coś ogólna:

myToFixed = function (n, digits) { 
    digits = digits || 0; 
    return n.toFixed(digits).replace(new RegExp("\\.0{" + digits + "}"), ""); 
} 

myToFixed(32.1212, 2) --> "32.12" 
myToFixed(32.1212, 0) --> "32" 
myToFixed(32, 2) --> "32" 
myToFixed(32.1, 2) --> "32.10" 
+0

Bardzo brudne (i bardzo szybkie.) ... +1 –

+1

Nie działa dla 3.005 (oznacza, że ​​jest liczbą całkowitą). – Mark

2
function toFixed0d(x, d) 
{ 
    if(Math.round(x) == x) 
    { 
     return x.toString(); 
    }else 
    { 
     return x.toFixed(d); 
    } 
} 

toFixed0d(3.123123423, 2) = "3.12" 
toFixed0d(0, 2) = "0" 
4

nie trzeba Math.round():

var toFixed = function(val, n) { 
    var result = val.toFixed(n); 
    if (result == val) 
    return val.toString(); 
    return result; 
} 

toFixed(3.123, 2) --> "3.12" 
toFixed(3, 2) --> "3" 
+0

PS: działa również dla * .000..0, np. 3.00.toString() == "3" – Matthias

+1

Nie można tego naprawić (3.10, 2) -> "3.1", ale powinno być "3.10", jak sądzę. – Fabian

+0

@Fabian dobry punkt! – Matthias

1

Należy pamiętać, że toFixed() to broken in IE i generalnie nie można polegać na nim. Daje to irytujące, ale dokładnie zaokrąglone funkcje zastępcze.

0

Oto funkcja wpadłem po myśli o tym samym problemem na chwilę:

function toFixed (number, n) { 
    return parseFloat(number.toFixed(n)); 
} 

Jak na to pytanie, to funkcja zwróci się następująco:

toFixed(3.123123423, 2); 
> 3.12 
toFixed(0, 2); 
> 0 
toFixed(3.1, 2); 
> 3.1 
toFixed(3.005, 2); 
> 3 
toFixed(3.005, 3); 
> 3.005 
toFixed(3.0500, 4); 
> 3.05 

Należy pamiętać, że metoda toFixed obiektu JavaScript obiektu Number faktycznie zwraca wartość String. Powyższa funkcja toFixed zwróci wartość Number. Jeśli wolisz mieć String następnie użyć następujących zamiast:

function toFixed (number, n) { 
    return parseFloat(number.toFixed(n)).toString(); 
} 
1

Number.toFixed produkuje pewne dziwaczne wyniki matematycznie i daje cyfr ułamkowych prosiłeś, czy są potrzebne czy nie.

Math.round jest matematycznie poprawny, ale nie pozwala określić precyzji.

Oto funkcja, która jest matematycznie poprawna (pomijając błędy zmiennoprzecinkowe) i daje to, co chcesz.

var roundToPlusInfinity = function(n, fd) { 
    var scale = Math.pow(10, fd), 
     rounded = fd ? Math.floor((n * scale + 0.5))/scale : 
     Math.round(n); 
    return rounded.toString(); 
}; 

Algorytm jest: skalowanie w górę, tak aby cyfry chcesz się po lewej stronie przecinka dziesiętnego, dodać .5 (tak,> = 0,5 w pierwszym nieistotne miejsce powoduje przyrost części całkowitej), skrócić (nie okrągłe!) I skalować z powrotem. Istnieje możliwość pojawienia się błędów zmiennoprzecinkowych, ale jest to lepszy widok niż nędzna funkcja FIXed.

Testowanie go:

roundToPlusInfinity(5.53335, 4); // "5.3334" 
roundToPlusInfinity(-9999.95, 1); // "-9999.9" 
roundToPlusInfinity(3.00015, 3); // "3" 

Ze względu na możliwość błędu pływający punkt, w dół, skala może dać wynik jak „3.00000000001”, co jest denerwujące. Coś takiego powinno zająć się tym.

var trimFraction = function(s, fd) { 
    var splitPoint = s.indexOf('.'); 
    if (splitPoint === -1) { 
     return s; 
    } 

    var f = s.substring(splitPoint + 1, s.length), 
     i = s.substring(0, splitPoint); 
    if (f.length > fd) { 
     f = f.substring(0, fd).replace(/0+$/, ""); 
    } 
    if (f) { 
     return i + '.' + f; 
    } 
    return i; 
}; 

trimFraction("3.1000000001", 2); // "3.1" 

Nie sprecyzowałeś algorytmu zaokrąglania, który chcesz. Okrąg w kierunku plus nieskończoności to zaokrąglenie, którego nauczyłeś się w szkole, gdzie okrążasz> = .5 do (tj. W kierunku dodatniej nieskończoności). Uważam, że w rachunkowości prawidłowy algorytm zaokrąglania (poza Szwajcarią i Argentyną przynajmniej) jest zera. Proste:

var roundAwayFromZero = function(n, fd) { 
    var ret = roundToPlusInfinity(Math.abs(n), fd); 
    return (n < 0) ? '-' + ret : ret; 
}; 

roundAwayFromZero(-9999.95, 1); // "-10000" 

Jeśli wyniki są dla ludzkiego prezentacji Intl.NumberFormat możliwość, ponieważ można określić zarówno minimalną i maksymalną liczbę cyfr ułamkowych. W chwili pisania tego artykułu nie jest on dokładnie obsługiwany i, zakładając, że Chrome poprawnie implementuje specyfikację, używa tego samego nieprzeniknionego i prostego, niewłaściwego algorytmu obcięcia, jak wFixed. Co ciekawe, styl "waluty" używa roundAwayFromZero (lub zaokrąglenia do połowy, jeśli kod waluty to "CHF", co jest miłym akcentem).