Jak parsować zmiennoprzecinkowe z dwoma miejscami dziesiętnymi w javascript?


410

Mam następujący kod. Chciałbym mieć taką, aby jeśli price_result jest liczbą całkowitą, powiedzmy 10, to chciałbym dodać dwa miejsca po przecinku. Czyli 10 to 10.00. Lub jeśli równa się 10,6, to 10,60. Nie jestem pewien, jak to zrobić.

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));

Odpowiedzi:


914

Aby to zrobić, możesz użyć metody toFixed ()

var twoPlacedFloat = parseFloat(yourString).toFixed(2)

1
z przyjemnością pomagam i kontynuuję dobrą pracę nad - „uczeniem się nowych rzeczy każdego dnia”
Mahesh Velaga

3
toFixed jest jednak dość wadliwy. Oto lepszy link niż programista
gotofritz

125
ale toFixed () zwraca liczbę jako ciąg znaków, jeśli porównasz liczby, musisz ponownie użyć parseFloat.
Pedro Muniz

19
Użyj, var twoPlacedFloat = + parseFloat(yourString).toFixed(2)aby przekonwertować na pływaka
Jose Rui Santos,

13
Dodaj parens, aby uzyskać liczbę zamiast ciągu: parseFloat ((yourString) .toFixed (2));
pvanallen,

50

Kiedy używasz toFixed, zawsze zwraca wartość jako ciąg. Czasami komplikuje to kod. Aby tego uniknąć, możesz zrobić alternatywną metodę dla liczby.

Number.prototype.round = function(p) {
  p = p || 10;
  return parseFloat( this.toFixed(p) );
};

I użyć:

var n = 22 / 7; // 3.142857142857143
n.round(3); // 3.143

lub po prostu:

(22/7).round(3); // 3.143

Napisałem program koszyka i próbowałem przy użyciu metod toFixed () i metod round () powiązanych z metodą parseFloat (). Żadna z tych metod nie działała z parseFloat ().
Chris22

To zaoszczędziło mi trochę potencjalnych bólów głowy. +1 za to. Nie miałem pojęcia, że ​​zamieni liczby na ciągi.
Lukas,

@Lukas Is not, if do parseFloat
Vlada

Zwraca 2, jeśli
ubiegam się o

Ta metoda służy do poprawiania, a nie do formatowania. Na przykład: 0.1 + 0.2 // 0.30000000000000004więc potrzebuję korekty(0.1+0.2).round() // 0.3
Vlada,

47

Jeśli potrzebujesz wydajności (jak w grach):

Math.round(number * 100) / 100

Jest około 100 razy szybszy niż parseFloat (number.toFixed (2))

http://jsperf.com/parsefloat-tofixed-vs-math-round


5
Przy powyższej formule „2.00” zwraca 2., ale chcę, aby była to 2.00.
Saurin Dashadia,

5
Nie możesz mieć tego na dwa sposoby. Jeśli chcesz, aby dane wyjściowe były liczbą zamiast ciągu, to nie otrzymasz końcowych zer. Możesz więc użyć powyższego przekonwertowanego na ciąg: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen,

3
Czy zwiększy się prędkość, jeśli zmienię 100 na 200?
alashow

Jeśli liczba operacji zmiennoprzecinkowych pozostanie taka sama, prędkość będzie taka sama, więc nie
Rob Boerman

dlaczego nie jest proste, number * 1że coś może mi umknąć?
ncubica,

11

Aby zwrócić liczbę, dodaj kolejną warstwę w nawiasach. Utrzymuje to w czystości.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));

2
Brakuje Ci czegoś w formule? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))generuje błąd.
Saurin Dashadia,

przepraszam, miałem zmienną łańcuchową zamiast liczby, która toFixed () potrzebuje - teraz naprawiona. Ale odpowiedź Roba przy użyciu Math.round jest czymś, co należy rozważyć pod względem wydajności.
pvanallen,

To powinien być komentarz do odpowiedzi Vlady.
Rodrirokr

5

Jeśli Twoim celem jest parsowanie, a Twój wkład może być dosłowny, możesz spodziewać się floati toFixednie zapewni tego, więc oto dwie proste funkcje, aby to zapewnić:

function parseFloat2Decimals(value) {
    return parseFloat(parseFloat(value).toFixed(2));
}

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}

2
To nie działa zgodnie z oczekiwaniami. parseFloat(parseFloat('10.5').toFixed(2))powrót 10.5espected 10.50. Również parseFloat(parseFloat('10.50').toFixed(2))wróć10.5
MTK

Jest to liczba zmiennoprzecinkowa, więc 10,5 to 10,50
Savage

Wiem, że 10,5 == 10,50, ale muszę wydrukować do klienta 10,50, a nie 10,5
MTK

2

Ceil z lodash jest prawdopodobnie najlepszy

_.ceil("315.9250488",2) 
_.ceil(315.9250488,2) 
_.ceil(undefined,2)
_.ceil(null,2)
_.ceil("",2)

będzie działał również z liczbą i jest bezpieczny


1
Prawdziwa odpowiedź, jeśli używam lodash, obecnie używam underscore.js, a obecnie w wersji 1.9.1 nie ma podobnej funkcji.
Rodrirokr

1

@sd Krótka odpowiedź: W JS nie ma możliwości, aby wartość typu liczby zawierała końcowe zera po przecinku.

Długa odpowiedź: jest właściwością toFixedlub toPrecisionfunkcją JavaScript, aby zwrócić ciąg znaków. Powodem tego jest to, że typ danych Number nie może mieć wartości takiej jak a = 2.00, zawsze usunie końcowe zera po przecinku. Jest to wbudowana właściwość typu danych Number. Aby osiągnąć powyższe w JS, mamy 2 opcje

  1. Użyj danych jako ciągu lub
  2. Zgadzam się na obcięcie wartości z przypadkiem „0” na końcu ex 2,50 -> 2,5. Liczba Nie może mieć końcowych zer po przecinku

0

Użyj poniższej funkcji, jeśli nie chcesz zaokrąglać.

function ConvertToDecimal(num) {
    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
   alert('M : ' +  Number(num)); //If you need it back as a Number    
}

0

Jaka jest jego wartość: Liczba dziesiętna jest liczbą dziesiętną, albo zaokrąglasz ją do innej wartości, albo nie. Wewnętrznie będzie przybliżać ułamek dziesiętny zgodnie z zasadą zmiennoprzecinkowej artmetyki i obsługi. Pozostaje wewnętrznie liczbą dziesiętną (zmiennoprzecinkową, w JS podwójną), bez względu na to, z iloma cyframi chcesz ją wyświetlić.

Aby zaprezentować go do wyświetlania, możesz wybrać precyzję wyświetlania do dowolnej wartości poprzez konwersję ciągów. Prezentacja to problem z wyświetlaniem, a nie pamięć.


0

Możesz użyć .toFixed (), aby dla liczb zmiennoprzecinkowych 2 cyfry

Exampale

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

-1

Spróbuj tego (patrz komentarze w kodzie):

function fixInteger(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseInt(value);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseInt(value);
    }
    // apply new value to element
    $(el).val(newValue);
}

function fixPrice(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseFloat(value.replace(',', '.')).toFixed(2);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseFloat(value).toFixed(2);
    }
    // apply new value to element
    $(el).val(newValue);
}

-1

Prosty JavaScript, ciąg znaków do pływaka:

var it_price = chief_double($("#ContentPlaceHolder1_txt_it_price").val());

function chief_double(num){
    var n = parseFloat(num);
    if (isNaN(n)) {
        return "0";
    }
    else {
        return parseFloat(num);
    }
}


-2
Solution for FormArray controllers 

Zainicjuj narzędzie FormArray Form Builder

  formInitilize() {
    this.Form = this._formBuilder.group({
      formArray: this._formBuilder.array([this.createForm()])
    });
  }

Utwórz formularz

  createForm() {
    return (this.Form = this._formBuilder.group({
      convertodecimal: ['']
    }));
  }

Ustaw wartości formularza na kontroler formularzy

  setFormvalues() {
    this.Form.setControl('formArray', this._formBuilder.array([]));
    const control = <FormArray>this.resourceBalanceForm.controls['formArray'];
    this.ListArrayValues.forEach((x) => {
      control.push(this.buildForm(x));
    });
  }

  private buildForm(x): FormGroup {
    const bindvalues= this._formBuilder.group({
      convertodecimal: x.ArrayCollection1? parseFloat(x.ArrayCollection1[0].name).toFixed(2) : '' // Option for array collection
// convertodecimal: x.number.toFixed(2)    --- option for two decimal value 
    });

    return bindvalues;
  }

-3

Mam inne rozwiązanie.

Zamiast tego możesz round()to zrobićtoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)

7
@AustinHenley Próbowałem użyć round () i to nie działało. Prawdopodobnie dlatego ludzie nie głosują. Może on odnosić się do Math.round ()
Nathan

@Nathan, należy go użyć inline, po tym, parseFloat()jak zaktualizowałem odpowiedź przez @zsalzbank
Alastair

3
Nie, to nie działa. Możesz spróbować Math.round (parseFloat (yourString), 2);
Augie Gardner,

1
Dlaczego nie zanotować odpowiedzi, która nigdy nie zadziała? Po prostu nie ma takiej metody jak round()na liczbach w js. Prawdziwe pytanie brzmi: kto to głosował?
meandre
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.