piet: Kommazahl erzeugen

Hallo,

ich habe ein Eingabefeld für eine Gleitkommazahl. Ich möchte vor der Weiterverarbeitung prüfen ob es eine Kommazahl ist.

12.3 OK 12 Fehler -> 12.0 12,0 Fehler -> 12.0 (kein Komma)

Entweder ich blocke es gleich mit Javascript ab, oder erst mit Perl auf dem Server. Eventuell ist es besser im Javascript, da könnte ich z.B. nur die Tasten 0-9 -. zulassen. Hört sich gut an, jedoch wie geht so etwas.

Gruß henry

  1. Hallo piet,

    eine serverseitige Prüfung ist auf jeden Fall erforderlich. Man nimmt keine Daten vom Client ungeprüft entgegen.

    Der Grund für die Form der Prüfung entzieht sich mir aber. „12“ oder "12." sind valide Kurzformen für "12.0", statt "0.12" gibt man gern auch mal sparsamerweise ".12" ein und im deutschen Sprachraum ist "12,3" als Dezimalzahl absolut gültig.

    D.h. du solltest akzeptieren: 1-n Ziffern, optional gefolgt von einem Dezimaltrennzeichen und 0-m weiteren Ziffern ODER ein Dezimaltrennzeichen und 1-m weitere Ziffern.

    Sowas geht mit dem pattern-Attribut des input Elements (sogar im IE, ab Version 10) und einer geschickten REGEX.

    HTML:

    <label for="foo">Bitte eine Dezimalzahl eingeben:"</label> <input name="foo" id="foo" pattern="\d+([,.]\d*)?|[,.]\d+">

    CSS:

    input:not(:valid) { background-color: #fcc; }

    Rolf

    -- sumpsi - posui - clusi
    1. Hallo Rolf B,

      input:not(:valid) { background-color: #fcc; }

      Warum nicht

      input:invalid { background-color: #fcc; }

      ?

      Bis demnächst
      Matthias

      -- Pantoffeltierchen haben keine Hobbys.
      1. Hallo Matthias,

        weil ich blöd bin und nur :valid kannte.

        Rolf

        -- sumpsi - posui - clusi
    2. @@Rolf B

      Der Grund für die Form der Prüfung entzieht sich mir aber. „12“ oder "12." sind valide Kurzformen für "12.0"

      Mit . (,) als letztem Zeichen biste bei δ Ori – waren wir uns nicht einig, dass das kein akzeptabler Endzustand ist?

      Sowas geht mit dem pattern-Attribut des input Elements (sogar im IE, ab Version 10) und einer geschickten REGEX.

      Oder? Der Wert des pattern-Attributs ist doch ein RegExp (wenn nicht sogar ein regulärer Ausdruck), oder?

      LLAP 🖖

      -- „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
      1. Hallo Gunnar Bittersmann,

        Mit . (,) als letztes Zeichen biste bei δ Ori – waren wir uns nicht einig, dass das kein akzeptabler Endzustand ist?

        „Wobei die Kriterien sich durchaus unterscheiden können.“ Ebenda.

        Bis demnächst
        Matthias

        -- Pantoffeltierchen haben keine Hobbys.
        1. Hallo Matthias,

          Ebenda!

          Rolf

          -- sumpsi - posui - clusi
    3. Hi,

      D.h. du solltest akzeptieren: 1-n Ziffern, optional gefolgt von einem Dezimaltrennzeichen und 0-m weiteren Ziffern ODER ein Dezimaltrennzeichen und 1-m weitere Ziffern.

      Du bist heute aber wieder positiv …

      Solange "Gleitkommazahl" die einzige Anforderung ist, sollte vorneweg noch optional ein Vorzeichen erlaubt sein: [+-]?

      Und hintenraus noch ein e + Vorzeichen + Ziffern für den Exponent.

      cu,
      Andreas a/k/a MudGuard

  2. Hallo,

    ich habe ein Eingabefeld für eine Gleitkommazahl.

    Nein hast Du nicht. Übertragen werden nämlich keine Zahlen sondern Strings!

    Ich möchte vor der Weiterverarbeitung prüfen ob es eine Kommazahl ist.

    Nein das auch nicht. Vielmehr möchtest Du Stringoperationen anwenden.

    MfG

    PS: Es sei denn Du möchtest Eine typisierte Übertragung

    1. Hallo,

      vielen Dank an alle. Das funktioniert auch so weit so gut.

      Jetzt soll das "Eingabefeld" noch "umschaltbar" sein … 😟

      Über ein Auswahlmenü (option) kann noch vorgewählt werden, welches Format eigegeben werden kann.

      Dezimal, Gleitkomma, Hexadezimal

      Jetzt müsste ich die Taste je nach "Formatauswahl" abfragen, oder erste mit der submit Taste die eingegebene Zahlen prüfen (javascrip)

      Wie wäre euer Vorschlag ....

      1. Moin,

        zunächst einmal klären wir den Begriff der Typisierung: T. heißt, den Wertebereich und die Bytelänge einer Zahl festzulegen. Beispielsweise, um eine Fließkommazahl 123450.12345 mit genau 4 Bytes transportieren zu können, für die Zahl 123450.12345 sind das diese Bytes 10 1D F1 47 also genau 4 Bytes mit diesen Wertigkeiten.

        Du siehst also, die Typisierung wird nur dann wichtig, wenn es um den Transport und die Speicherung geht. Ein Browser jedoch erzeugt mit einer solchen Eingabe nicht 4 Bytes sondern betrachtet die Eingabe als String und sendet damit auch 123450.12345 als String.

        Damit dürfte klar werden, daß auch Deine neuerlichen Überlegungen bezüglich Eingabeformate stets auf Stringoperationen hinauslaufen. Schau Dir mal die Perlfunktion hex() an, diese Funktion nimmt einen String als hexadezimale Darstellung einer Zahl und liefert diese.

        MfG

      2. Hallo piet,

        du kannst für die clientseitige Prüfung den Wert des pattern-Attributs mit JavaScript umschalten. Beim Submit gibst du den Wert des Formatwählers mit zum Server, damit du dort weißt, welches Format du validieren musst.

        Rolf

        -- sumpsi - posui - clusi
        1. Gute Idee! Serverseitig evntl. so

          if( $self->param('cc') ){ my $fpnr = $self->param('fpnr'); $fpnr =~ s/,/\./; $self->header("Content-Type","text/html"); $self->{CONTENT} = eval{ $self->ents( sprintf "%0.3f: %02X %02X %02X %02X", $fpnr, unpack("CCCC", pack "f", $fpnr)); } || "Falsches Format!"; }

          Demo