Kommazahl erzeugen
piet
- javascript
- perl
0 Rolf B0 Matthias Apsel0 Rolf B
0 Gunnar Bittersmann0 Matthias Apsel0 Rolf B
0 MudGuard
-1 pl
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
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
Hallo Rolf B,
input:not(:valid) { background-color: #fcc; }
Warum nicht
input:invalid { background-color: #fcc; }
?
Bis demnächst
Matthias
Hallo Matthias,
weil ich blöd bin und nur :valid kannte.
Rolf
@@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 🖖
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
Hallo Matthias,
Ebenda!
Rolf
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
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
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 ....
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
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
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!";
}