number_format() rückwärts

Thomasio

Erfahrenes Mitglied
Ich habe ein HTML Formular, wo der User eine Zahl mit bis zu 3 Dezimalstellen eingeben soll.
Abhängig von seiner Sprache und Angewohnheiten könnte er alle möglichen Zahlenformate eingeben, bis hin zu ganze Zahlen, wenn er keine Dezimalstellen braucht.

1234,123
1234.123
1.234,00
0001
usw.

Und natürlich könnte der User auch Unsinn eingegeben haben.
Ich will jetzt den gesendeten Wert überprüfen und in MySql eintragen, wo ich ein Feld vom Typ

decimal(10,3)

habe.

Wie komme ich also von

$MyValue = $_POST['myvalue'];

zu einem gültigen Wert oder Error?

Code:
if(!$gueltig)
{
// error
}
else
{
mysql_query("UPDATE `tablename` SET `fieldname` = ".$MyValue." WHERE `id` = 1");
}
 
Direkt in SQL
SQL:
CAST('1234.56' AS DECIMAL(10,3))
 
Zuletzt bearbeitet von einem Moderator:
Die Frage ist, was ist jetzt wirklich ein gültiger Wert?

Darf ich 123 als Ganzzahl eingeben oder 123,45 mit nur 2 Nachkommastellen? Darf ich die Nachkommastellen nur mit Komma abgrenzen oder ist ein Punkt als Trennzeichen auch erlaubt?
 
Alles was ich als Zahl erkennen kann ist gültig, muss nur so umformatiert werden, dass mysql_query() es annimmt.
Gibt der User

1234

ein, macht mysql automatisch

1234.000

dazu, aber ich weiss nicht wo die Automatik ihre Grenzen hat, bzw. wie weit ich ohne zu grossen Aufwand den gesendeten Wert als Zahl erkennen kann.
Z.B. bei

1.234,001

sollte mein Script schon in der Lage sein daraus

1234.001

zu machen, aber ob ich aus

abc1.23ef,g000

noch

123.000

machen soll, oder besser Error, ist eine Frage vom Aufwand.
Im Zweifelsfalle gebe ich einfach Error aus für alles was nicht von Haus aus passt, aber ich weiss schon nicht, wie ich prüfen soll, ob der gesendete Wert eine gültige Zahl ist.
 
Hi,

wie willst du dann zum Beispiel die Eingabe "123.456" interpretieren?
(in deutscher Schreibweise: )
1. Als 123456
2. Als 123,456

Würde hier eine strikte Vorgabe für das Format erstellen und so wenige Formate wie möglich zulassen. Zum Beispiel das deutsche und englische Format, jeweils ohne Tausendertrennzeichen.

Dann könntest du die Überprüfung mit einem einfachen Regex und anschließend einen Cast mit der Funktion floatval() machen:
PHP:
if(preg_match('/^[0-9]+([.,][0-9]{1,3})?$/', $MyValue)) {
  $MyValue = floatval(preg_replace('/,/', '.', $MyValue));

  // Gültig, Query normal abfeuern
}else {
  // Ungültig, Abbrechen
}

Das Codeschnipsel ist ungetestet, müsste aber seinen Zweck erfüllen :)
Ansonsten hab ich hier auf die Schnelle noch was gefunden was helfen könnte: Klick

Gruß
BK
 
Zuletzt bearbeitet:
Also ich würde es dem Benutzer nicht zu einfach machen. Gib einfach an wie Zahlen einzugeben sind und prüfe dann ob es eine gültige Zahl ist.

Zum Beispiel so:

PHP:
<?php

$zahl = "123,456";

if ((string) doubleval($zahl) == $zahl) {
    echo $zahl ." ist g&uuml;ltig";
} else {
    echo $zahl ." ist ung&uuml;ltig";
}
?>
<br />
<br />
<?php

$zahl = "123.456";

if ((string) doubleval($zahl) == $zahl) {
    echo $zahl ." ist g&uuml;ltig";
} else {
    echo $zahl ." ist ung&uuml;ltig";
}
?>
 
Dass er eine Zahl eingeben soll weiss der User, aber Vertrauen ist Glückssache, ein einfacher Tippfehler reicht ja schon.
Zu einfach will ich es dem User nicht machen, darum gebe ich im Moment Error aus für alles was ausser Zahlen, Punkt und Komma noch irgendwas enthält.
Was ich gerne machen würde ist Punkt und Komma als Dezimalzeichen erlauben, aber da weiss ich nicht, wie ich Tausender-Trennzeichen von Dezimalzeichen unterscheiden soll, insbesondere weil in Deutsch und Englisch Punkt und Komma genau andersrum verwendet werden.
Was also tun bei

1.000

wenn ein deutscher User damit

1000,000

meint?

Vielleicht Tausenderzeichen gar nicht erlauben, sprich den string prüfen, dass maximal ein (Punkt oder Komma) existiert und nur wenn das stimmt das Komma zu Punkt konvertieren?
Oder kann PHP/MySql mit beidem umgehen?
 
Ich würde es so machen. Nämlich dem User vorgeben das er bei Zahlen KEIN Tausender-Trennzeichen eingeben darf.
Dann einfach prüfen ob ein Komma enthalten ist und dieses in einen Punkt umwandeln.
 
Ja, as sehe ich mittlerweile auch so, maximal 1 Punkt oder Komma, ist wohl am Sichersten und auch leicht zu prüfen.
Bleibt nur noch die min/max value, davon habe ich mal überhaupt keine Ahnung.
Was kann decimal(10,3) aufnehmen und wie überprüfe ich, ob der eingegebene Wert in diesem Bereich liegt?
 
Keine Ahnung was für Zahlen du speichern musst, aber ich glaube nicht das du damit Probleme bekommst.

Hier kannst du nachlesen wie groß bzw. klein eine Zal vom Typ Double sein darf.

Im schlimmsten Fall wandelst du die eingegebene Zahl in einen integer Wert um und prüfst dann wie viele Stellen die Zahl hat.
 
Zurück