Liczba zmiennoprzecinkowa analizy JavaScript ignoruje cyfry po przecinku


81

Oto prosty scenariusz. Chcę pokazać odjęcie dwóch wartości wyświetlanych w mojej witrynie:

//Value on my websites HTML is: "75,00"
var fullcost = parseFloat($("#fullcost").text()); 

//Value on my websites HTML is: "0,03"
var auctioncost = parseFloat($("#auctioncost").text());

alert(fullcost); //Outputs: 75
alert(auctioncost); //Ouputs: 0

Czy ktoś może mi powiedzieć, co robię źle?

Odpowiedzi:


159

To jest „zgodne z projektem”. parseFloatFunkcja będzie brać pod uwagę tylko te części łańcucha w górę aż osiągnie non +, -, liczba, wykładnik lub punktu dziesiętnego. Gdy zobaczy przecinek, przestaje szukać i bierze pod uwagę tylko część „75”.

Aby to naprawić, zamień przecinki na przecinki dziesiętne.

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

9
Czy to zadziała we wszystkich regionach? Czy nie używasz przecinka w zależności od ustawień regionalnych w systemie operacyjnym?
Dusan Plavak

14
Powyższy kod usunie tylko pierwszy znak „,”. A jeśli liczba ta wynosi 700 000 000? Potrzebujesz: .replace (/, / g, '')
hyankov

17
Myślę, że większość ludzi zapomina, że ​​przecinek może być również używany jako separator tysięcy, a nie tylko jako separator dziesiętny.
Peter Raeves

3
Witam, a co jeśli wejście 5.200,75oznacza pięć tysięcy dwieście siedemdziesiąt pięć.
hasan05

Ta odpowiedź zadziała tylko w obecnym scenariuszu i jeśli na przykład liczba wynosi 15 000, to pokaże 15, co jest niepoprawne!
itsHarshad

31

javascript parseFloat nie przyjmuje parametru ustawień regionalnych. Więc trzeba będzie wymienić ,z.

parseFloat('0,04'.replace(/,/, '.')); // 0.04

19
A co, jeśli liczba ta wynosi 7 000 000,15?
Peter Raeves

7
Jesteś odpowiedzialny za dostosowanie swoich ciągów do wyglądu pływaka, gdy próbujesz je przeanalizować. Jeśli twoje ustawienia regionalne używają kropek jako miejsc dziesiętnych, możesz bezpiecznie usunąć wszystkie przecinki (separatory tysięcy) przed próbą przetworzenia ich na liczbę zmiennoprzecinkową. Jeśli Twoje ustawienia narodowe używają przecinków zamiast kropek dla miejsc dziesiętnych, możesz bezpiecznie usunąć wszelkie kropki (separatory tysięcy), a następnie zmienić przecinek (separator dziesiętny) na kropkę.
Ultroman the Tacoman



12

Jak @JaredPar wskazał w swojej odpowiedzi, użyj parseFloatzastąpienia

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

Po prostu zastąpienie litery commaa dotspowoduje naprawę, chyba że liczba ponad tysiąca w 1.000.000,00ten sposób da ci niewłaściwą cyfrę. Więc musisz wymienić commausunąć dots.

// Remove all dot's. Replace the comma.
var fullcost = parseFloat($("#fullcost").text().replace(/\./g,'').replace(',', '.'));

Używając dwóch zamienników, będziesz w stanie poradzić sobie z danymi bez otrzymywania błędnych cyfr w wyniku.


8

Lepiej jest użyć tej składni do zastąpienia wszystkich przecinków w przypadku miliona 1,234,567

var string = "1,234,567";
string = string.replace(/[^\d\.\-]/g, ""); 
var number = parseFloat(string);
console.log(number)

Sposób gusunięcia wszystkich przecinków.

Sprawdź demo Jsfiddle tutaj .


7

Liczby w JS używają .znaku (kropka / kropka), aby wskazać kropkę dziesiętną, a nie ,(przecinek).


1

Dla każdego, kto tu przyjeżdża i zastanawia się, jak poradzić sobie z tym problemem, w którym mogą występować przecinki ( ,) i kropki ( .), ale dokładny format liczb może nie być znany - tak poprawiam ciąg przed użyciem parseFloat()(zapożyczając pomysły z innych odpowiedzi):

function preformatFloat(float){
   if(!float){
      return '';
   };

   //Index of first comma
   const posC = float.indexOf(',');

   if(posC === -1){
      //No commas found, treat as float
      return float;
   };

   //Index of first full stop
   const posFS = float.indexOf('.');

   if(posFS === -1){
      //Uses commas and not full stops - swap them (e.g. 1,23 --> 1.23)
      return float.replace(/\,/g, '.');
   };

   //Uses both commas and full stops - ensure correct order and remove 1000s separators
   return ((posC < posFS) ? (float.replace(/\,/g,'')) : (float.replace(/\./g,'').replace(',', '.')));
};
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75

Pozwoliłoby to przynajmniej na parsowanie brytyjskich / amerykańskich i europejskich formatów dziesiętnych (zakładając, że ciąg zawiera prawidłową liczbę).


Działa świetnie w obu formatach 1,234.56i1.234,56
joseantgv

0

W moim przypadku miałem już kropkę (.)i przecinek (,), więc to, co zadziałało, to replaceprzecinek (,)z pustym ciągiem, jak poniżej:

parseFloat('3,000.78'.replace(',', '')) 

Przy założeniu, że kwota z istniejącej bazy danych wynosi 3 000,78. Wyniki są następujące: 3000.78bez początkowego przecinka (,).


-1

Z mojego kraju pochodzenia format waluty to „3.050,89 €”

parseFloat identyfikuje kropkę jako separator dziesiętny, aby dodać 2 wartości, możemy to zapisać w ten sposób:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
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.