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?

Tylko tu boliwijczyk
źródło

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(',', '.'));
JaredPar
źródło
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
Joe
źródło
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
20

Dlaczego nie skorzystać z globalizacji? To tylko jeden z problemów, z którymi możesz się spotkać, gdy nie używasz języka angielskiego:

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

Kilka linków w stackoverflow, do których należy zajrzeć:

jamie
źródło
18

parseFloatanalizuje zgodnie z definicją JavaScript literału dziesiętnego , a nie zgodnie z definicją ustawień regionalnych. (Np. parseFloatNie jest świadomy lokalizacji). Literały dziesiętne w JavaScript używają .jako przecinka dziesiętnego.

TJ Crowder
źródło
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.

Michel Ayres
źródło
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 .

mustapha mekhatria
źródło
7

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

Quentin
źródło
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ę).

sbgib
źródło
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 (,).

Zack
źródło
-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(',', '.'))
Abel
źródło