ebody: Warum gibt parseFloat() immer NaN zurück?

problematische Seite

Hallo,

warum gibt parseFloat() immer NaN zurück?

$( document ).ready(function() {

  var obj = {
    "arr":[
      {
        "int1" : "‭84.944403573305308",
        "int2" : "‭96.13809774040988"
      }
    ]
  }
  
  $('#result1 > span').text(parseFloat("‭84.944403573305308"));
  $('#result2 > span').text(parseFloat(obj.arr[0].int1));
  $('#result3 > span').text(parseFloat(obj.arr[0].int2));
  $('#result4 > span').text(parseFloat("‭‭96.13809774040988"));
  $('#result5 > span').text(parseFloat("‭‭96.138097"));
  
});

https://codepen.io/ebody/pen/PowgZxb?editors=1010

Gruß ebody

akzeptierte Antworten

  1. problematische Seite

    Hallo ebody,

    warum gibt parseFloat() immer NaN zurück?

    weil dein Quelltext unsichtbare Zeichen enthält, in diesem Fall U+202D, Left-To-Right Override. Direkt hinter dem öffnenden ".

    Freundliche Grüße,
    Christian Kruse

    1. problematische Seite

      Hallo,

      weil den Quelltext unsichtbare Zeichen enthält, in diesem Fall U+202D, Left-To-Right Override. Direkt hinter dem öffnenden ".

      ich hatte auch (zufällig) entdeckt, dass es an den " liegt. Wie kommt man auf unsichtbare Zeichen und überhaupt, wie kommen die dahin?

      Gruß
      Kalk

      1. problematische Seite

        Hallo Tabellenkalk,

        Wie kommt man auf unsichtbare Zeichen […]

        Erfahrung. Wenn man mal zwei, drei mal darüber gestolpert ist, dann denkt man sofort daran das zu überprüfen.

        und überhaupt, wie kommen die dahin?

        Das kann in diesen Fall nur ebody beantworten, aber meine Erfahrung sagt: durch Copy&Paste aus externen, dritten Quellen ist die häufigste Ursache.

        Freundliche Grüße,
        Christian Kruse

        1. problematische Seite

          Hatte ich auch schon ein, zweimal und zwar in Mail-Adressen. Die kann man damit ungültig machen, und du suchst dir einen Wolf.

          In meinem Editor Geany „hängt” die Textmarke an der betreffenden Stelle, wenn man mit den Cursor-Tasten den String abfährt.

    2. problematische Seite

      weil den Quelltext unsichtbare Zeichen enthält, in diesem Fall U+202D, Left-To-Right Override. Direkt hinter dem öffnenden ".

      Danke, daran liegt es. Hier habe ich die Zahl mit " ganz neu eingetippt und es funktioniert. $('#result1 > span').text(parseFloat("84.944403573305308"));

      Ich hatte sie zuvor mit Copy/Paste eingefügt.

      Wie hast du die unsichtbaren Zeichen denn gefunden? Weil ich hatte sie zuvor auch schon mal in Notepad++ überprüft. "Ansicht" > "Nicht druckbare Zeichen" > "Alle anzeigen", da wurde aber nichts angezeigt.

      Gruß ebody

      1. problematische Seite

        Hallo ebody,

        Wie hast du die unsichtbaren Zeichen denn gefunden? Weil ich hatte sie zuvor auch schon mal in Notepad++ überprüft. "Ansicht" > "Nicht druckbare Zeichen" > "Alle anzeigen", da wurde aber nichts angezeigt.

        Ich habe den String kopiert und mir eine Liste der Codepoints ausgeben lassen:

        console.log(Array.from("‭84.944403573305308").map(c => [c, c.charCodeAt(0)]));
        

        Von Notepad++ habe ich keine Ahnung, dazu kann ich nichts sagen.

        Freundliche Grüße,
        Christian Kruse

        1. problematische Seite

          Vielen Dank, werde ich mir merken :-)

          Gruß ebody

        2. problematische Seite

          Hallo Christian Kruse,

          console.log(Array.from("‭84.944403573305308").map(c => [c, c.charCodeAt(0)]));
          

          Alternativ geht auch https://www.fontspace.com/unicode/analyzer/?q=("‭84.944403573305308"))%3B

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
          1. problematische Seite

            Hallo Matthias,

            Alternativ geht auch https://www.fontspace.com/unicode/analyzer/?q=("‭84.944403573305308"))%3B

            Nettes Tool. Kannte ich noch nicht. 👍

            Freundliche Grüße,
            Christian Kruse

        3. problematische Seite

          Hallo Christian

          Ich habe den String kopiert und mir eine Liste der Codepoints ausgeben lassen:

          console.log(Array.from("‭84.944403573305308").map(c => [c, c.charCodeAt(0)]));
          

          Nur zur Info, die Methode Array.from hat eine Mapfunktion bereits eingebaut, das heißt, du hättest die Callbackfunktion auch direkt übergeben können:

          console.log(Array.from("‭84.944403573305308", c => [c, c.charCodeAt(0)]));
          

          Wahrscheinlich sind aktuelle Ausführungsumgebungen clever genug, um zu erkennen, dass bei so einem Ausdruck nur ein Array erzeugt werden muss, also wird es am Ende auf dasselbe hinauslaufen. Wenn mehr Arbeit zu verrichten wäre als in diesem Beispiel, würde ich es aber vermutlich nicht darauf ankommen lassen wollen. Außerdem ist der Code ein wenig kürzer.

          Viele Grüße

      2. problematische Seite

        Hallo ebody,

        Wie hast du die unsichtbaren Zeichen denn gefunden? Weil ich hatte sie zuvor auch schon mal in Notepad++ überprüft. "Ansicht" > "Nicht druckbare Zeichen" > "Alle anzeigen", da wurde aber nichts angezeigt.

        Ich habe es mal mit Notepad++ ausprobiert:
        Zum einen hängt, wie von Linuchs beschrieben der Cursor zwischen dem Leerzeichen und der 8.
        Zum anderen gibt es für NPP einen Hex-Viewer als Plugin (offiziell leider nur für die 32-Bit-Variante). Mit dem kann man die unsichtbaren Zeichen sehen.

        Gruß
        Patrick

        1. problematische Seite

          Ich habe es mal mit Notepad++ ausprobiert:
          Zum einen hängt, wie von Linuchs beschrieben der Cursor zwischen dem Leerzeichen und der 8.

          Sorry, meinte natürlich das Anführungszeichen.

        2. problematische Seite

          Hallo,

          eine weitere Methode: Kodierung -> ANSI

          Gruß
          Patrick