Javascript parse float ignoriert die Dezimalstellen nach meinem Komma

80

Hier ist ein einfaches Szenario. Ich möchte die Subtraktion von zwei auf meiner Site angezeigten Werten anzeigen:

//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

Kann mir jemand sagen, was ich falsch mache?

Nur Bolivianer hier
quelle

Antworten:

152

Dies ist "By Design". Die parseFloatFunktion berücksichtigt nur die Teile der Zeichenfolge, bis ein Nicht +, -, eine Zahl, ein Exponent oder ein Dezimalpunkt erreicht ist. Sobald es das Komma sieht, hört es auf zu suchen und berücksichtigt nur den Teil "75".

Um dies zu beheben, konvertieren Sie die Kommas in Dezimalstellen.

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));
JaredPar
quelle
9
Funktioniert das in allen Regionen? Wird in Abhängigkeit von Ihren regionalen Einstellungen im Betriebssystem kein Komma verwendet?
Dusan Plavak
14
Der obige Code entfernt nur das erste ','. Was ist, wenn die Zahl 700.000.000 ist? Sie benötigen: .replace (/, / g, '')
hyankov
17
Ich denke, die meisten Leute vergessen, dass Komma auch als Tausendertrennzeichen und nicht nur als Dezimaltrennzeichen verwendet werden kann.
Peter Raeves
3
Hallo, was ist, wenn die Eingabe 5.200,75fünftausendzweihundert und fünfundsiebzig bedeutet?
hasan05
Diese Antwort funktioniert nur im aktuellen Szenario. Wenn beispielsweise 15.000 angegeben sind, werden 15 angezeigt, was falsch ist!
itsHarshad
31

parseFloat von javascript akzeptiert keinen Gebietsschema-Parameter. So müssen Sie ersetzen ,mit.

parseFloat('0,04'.replace(/,/, '.')); // 0.04
Joe
quelle
19
Was ist, wenn die Zahl 7.000.000,15 ist?
Peter Raeves
7
Sie sind dafür verantwortlich, Ihre Zeichenfolgen so anzupassen, dass sie wie ein Float aussehen, wenn Sie versuchen, sie zu analysieren. Wenn Ihr Gebietsschema Punkte für Dezimalstellen verwendet, können Sie alle Kommas (Tausendertrennzeichen) sicher entfernen, bevor Sie versuchen, sie in einen Gleitkommawert zu analysieren. Wenn Ihr Gebietsschema Kommas anstelle von Dezimalstellen verwendet, können Sie alle Punkte (Tausendertrennzeichen) sicher entfernen und dann das Komma (Dezimalpunkt) in einen Punkt ändern.
Ultroman der Tacoman
18

parseFloatAnalysiert nach der JavaScript- Definition eines Dezimalliteral , nicht nach der Definition Ihres Gebietsschemas. (ZB parseFloatist das Gebietsschema nicht bekannt.) Dezimalliterale in JavaScript werden .für den Dezimalpunkt verwendet.

TJ Crowder
quelle
12

Wie @JaredPar in seiner Antwort betonte, verwenden Sie parseFloatmit ersetzen

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

Nur das Ersetzen commadurch ein dotwird behoben, es sei denn, es ist eine Zahl über den Tausenden wie 1.000.000,00diese, erhalten Sie die falsche Ziffer. Sie müssen also das commaEntfernen der ersetzen dots.

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

Durch die Verwendung von zwei Ersetzungen können Sie mit den Daten umgehen, ohne falsche Ziffern in der Ausgabe zu erhalten.

Michel Ayres
quelle
8

Es ist besser, diese Syntax zu verwenden, um alle Kommas in einem Fall von einer Million 1.234.567 zu ersetzen

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

Das gbedeutet, alle Kommas zu entfernen.

Überprüfen Sie die Jsfiddle-Demo hier .

Mustapha Mekhatria
quelle
7

Zahlen in JS verwenden ein .Zeichen ,( Punkt / Punkt), um den Dezimalpunkt anzugeben, nicht ein (Komma).

QUentin
quelle
1

Für alle, die hier ankommen und sich fragen, wie sie mit diesem Problem umgehen sollen, bei dem Kommas ( ,) und Punkt ( .) möglicherweise eine Rolle spielen, das genaue Zahlenformat jedoch möglicherweise nicht bekannt ist - so korrigiere ich eine Zeichenfolge vor der Verwendung parseFloat()(Ausleihen von Ideen aus anderen Antworten):

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

Dies würde zumindest das Parsen von britischen / amerikanischen und europäischen Dezimalformaten ermöglichen (vorausgesetzt, die Zeichenfolge enthält eine gültige Zahl).

sbgib
quelle
Es funktioniert hervorragend für beide Formate 1,234.56und1.234,56
joseantgv
-1

Aus meinem Herkunftsland lautet das Währungsformat "3.050,89 €".

parseFloat identifiziert den Punkt als Dezimaltrennzeichen. Um zwei Werte hinzuzufügen, können wir ihn wie folgt setzen:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
Abel
quelle