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));
użytkownik357034
źródło

Odpowiedzi:

914

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

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Mahesh Velaga
źródło
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
Vlada
źródło
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

Rob Boerman
źródło
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));
pvanallen
źródło
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));
}
Brutalny
źródło
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

Antonio Terreno
źródło
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
Abhinav Pandey
źródło
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    
}
Nimesh
źródło
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ęć.

Andora
źródło
0

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

Exampale

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

//output
9.99
Rizo
źródło
-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);
}
Mitre Slavchev
źródło
-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);
    }
}
Arun Prasad ES
źródło
-2

Rozwiązanie, które działa dla mnie, jest następujące

parseFloat(value)
Jorge Santos Neill
źródło
-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;
  }
Thulasiram Virupakshi
źródło
-3

Mam inne rozwiązanie.

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

var twoPlacedFloat = parseFloat(yourString).round(2)
equipo_INSA-Inditex_OU
źródło
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