Usereingaben bereinigen


#1
Hallo Leute,

die User-Eingabe soll bereinigt werden, so dass am Ende eine verwertbare Zahl rauskommt. Soweit hat das auch geklappt, nur ein Problem ist dabei: Wenn ein Scherzkeks etwas wie "10,123,4545,2", also mehrere Kommata, eingibt, gibt es Warnungen.

Mein verzweifelter Gedanke war, dass ich auch alle Kommata entferne und an der dritten Stelle von hinten ein Komma einfüge, bevor die Zahl zum rechnen konvertiert wird. Nur... wenn jemand keinen Wert mit Komma eingibt, z.B. "100", dann würde darauf ja "1,00". Ist also auch nicht zweckdienlich.

Sorry, falls diese Newbie-Frage unter jeder Würde ist und ich die Antwort in der Dokumentation nicht finde – nicht zuletzt, weil ich vielleicht auch die falsche Frage stelle.

Code:
$_betrag = $_POST["betrag"];
# Umwandlung Eingabe in Variable

$_betrag = preg_replace('![^0-9^,]!', '', $_betrag);
# In reine Zahl umwandeln, Komma lassen

$_betrag = strtr($_betrag, ",", ".");
# Kommazahl auf englisches Format ändern

if (empty($_betrag)) {echo "Bitte einen Betrag eingeben!"; return;}
# Leeren Wert abfangen
Viele Grüße
Michael
 

Technipion

Erfahrenes Mitglied
#2
Ich würde die count Funktion benutzen um die Anzahl an Kommata im String zu erhalten. Und falls mehr als 1 Komma darin vorkommt, würde ich eiskalt eine Fehlermeldung ausgeben. Vielleicht hat sich ein User ja auch nur vertippt?
Danach weißt du dann ja auch, ob es eine Kommazahl ist oder nicht (wenn count = 1 bzw. count = 0).

Gruß Technipion
 
#3
Vielen Dank, Technipion! Ich will einfach immer dem User alles abnehmen und keine Fehlermeldungen auswerfen. Du hast aber recht, hier ist es – in diesem eher seltenen Fall – völlig legitim. In fett meine Änderung, die funktioniert gut, ich hoffe auch, dass sie so von echten Codern umgesetzt würde.

Code:
$_betrag = $_POST["betrag"];
# Umwandlung Eingabe in Variable

$_betrag = preg_replace('![^0-9^,]!', '', $_betrag);
# In reine Zahl umwandeln, Komma lassen

if ((substr_count($_betrag, ',')) > 1) {echo "Mehr als ein Komma eingegeben!"; return;}
 # Mehr als ein Komma?

$_betrag = strtr($_betrag, ",", ".");
# Kommazahl auf englisches Format ändern

if (empty($_betrag)) {echo "Bitte einen Betrag eingeben!"; return;}
# Leeren Wert abfangen
Meine letzten echten Programme schrieb ich in Basic auf dem C64 *hust*. Da ich zu PHP nur kam, weil ich "mal eben schnell" einen Umrechner schreiben wollte, habe ich das leider nie wirklich gelernt und mir viel Mist angewöhnt. Das Script sieht aus wie Kraut und Rüben, jetzt muss ich mal Struktur reinbringen und das ganze optimieren.

Gruß
Michael
 

Technipion

Erfahrenes Mitglied
#4
Du brauchst dich beim besten Willen nicht zu rechtfertigen. Du hast den Code auf den notwendigen und sinnvollen Ausschnitt reduziert, deine Gedanken dazukommentiert, und sogar in CodeTags gepostet. Die allermeisten würden das nicht tun.
Meine letzten echten Programme schrieb ich in Basic auf dem C64 *hust*. Da ich zu PHP nur kam, weil ich "mal eben schnell" einen Umrechner schreiben wollte, habe ich das leider nie wirklich gelernt und mir viel Mist angewöhnt. Das Script sieht aus wie Kraut und Rüben, jetzt muss ich mal Struktur reinbringen und das ganze optimieren.
Das klingt ganz danach als hast du kein Problem. Programmierer mit der Einstellung "verlernen" nichts und finden sich in neuen Sprachen i.d.R. schnell zurecht. Das wichtigste (die Grundlagen der Programmierung) sitzt nämlich schon.

Eine Anmerkung hätte ich da noch:
Im Programm heißt die Variable ja "betrag". Und du schreibst das ganze soll ein Umrechner sein. Evtl. macht es in dem Kontext Sinn die Anzahl an Nachkommastellen zu limitieren (eine Eingabe wie 12,3456€ macht ja eigentlich keinen Sinn)? Intern solltest du natürlich möglichst viele Stelle zur Umrechnung nutzen (ich gehe mal davon aus, dass grundsätzlich alle Eingaben in US$ umgerechnet werden, weil man an die Tauschkurse mit USD am einfachsten rankommt). Denke mal mit den üblichen 7 Nachkommastellen bei float - bzw. 16 bei double - kommst du da gut hin. Oder willst du damit an die Börse? :D

Gruß Technipion
 
#5
Hi Technipion,

gerade im Webserver- und PHP-Bereich herrscht in den meisten Foren ein eher rauer Tonfall. Mehr als die üblichen Sprüche ("Lies die Doku!!") bekommen da die Leute nicht. Beim Suchen nach Lösungen kam ich hierher und hier gefiel mir der Tonfall auch Anfängern gegenüber gut – aber Du hast da noch einen drauf gesetzt und mich auch noch motiviert. Danke und Chapeau!

Intern rechne ich ohne Begrenzung der Nachkommastellen, die Ausgabe ist über format_number auf zwei Stellen limitiert.

Das Ganze ist ein Kaufkraftumrechner. Ich kam darauf, weil immer alle Leute rumjammern, dass früher alles billiger war. Was so eine akutelle Spielkonsole kosten würde, die verwöhnten Bälger, etc. Stimmt alles nicht. So etwa dreissig Jahre zurück ist der Umrechenkurs in Euro 1:1. Mein C64 war damals teurer als ein kleiner Gaming-PC für die Kinder. Mein Philips G7000 hat damals genau soviel gekostet wie eine Playsi 4 heute. Auch Autos sind nicht meistens nicht teurer geworden. Der Sprit war in den 1990ern am billigsten und wir zahlen heute immer noch weniger als zu Zeiten der Energiekrise Mitte der 1970er.

Der Rechner ist "historisch gewachsen", also eher ein Flickwerk, dem ich nach ein paar Jahren endlich die ganzen Bugs austreiben will (vermutlich weil ich momentan eigentlich viel wichtigeres zu tun hätte :) ).

OT:
Meine Daten sind in einem äh... Javascript-Array? Hatte ich mir damals irgendwo abgeschaut. Sollte ich vermutlich auch lieber in PHP realisieren?

PHP:
<script type="text/javascript" src="jquery.js">
    </script>
<form method="POST">
    <select name="jahr" id="jahr" >
           <option value="358-1891">1891</option> # Alle Gehälter in EUR (1:1,95583)
        <option value="358-1892">1892</option> # Daten der RV sind auf Euro umgerechnet
           <option value="363-1893">1893</option>
... usw:
        <option value="46304-2014">2014</option>
        <option value="47460-2015">2015</option>
        <option value="48605-2016">2016</option>
    </select>
        <!-- -->
        <!-- User-Eingabe des Betrages -->
        <!-- -->
        <input name="betrag" size = 6>
        <input type=submit name=submit value="umrechnen!">
</form>
<!--  -->
<!-- Beginn PHP -->
<!--  -->
<?php
    error_reporting(E_ALL);
        if (!empty ($_POST ["submit"]))
            {
                $array = explode ("-", $_POST ['jahr']);
            }
#
Viele Grüße
Michael