bitte Kritik für meine Funktion

  • First -> ich hoff das, dies der richtige Platz dafür ist !?


    Ich hab eine kleine Funktion geschrieben die überprüft ob die Zahl vor dem Punkt eine Null enthält.
    was gut funktioniert^^


    PHP
    1. <span class="syntaxdefault">        function nullKomma </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$var</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">        </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">            $var </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"."</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $var</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">            if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$var</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">!=</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">            </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">                echo </span><span class="syntaxstring">"eine Zahl die <span style='color:red;'>keine</span> 0 vor der Kommastelle enthält"</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">            </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">            else<br />            </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">                echo </span><span class="syntaxstring">"eine Zahl die <span style='color:red;'>eine</span> 0 vor der Kommastelle enthält"</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">            </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">            return $var</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">        </span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> </span>


    meine Frage ist :
    Wie würdet ihr es machen ?
    eventuelle Verbesserungsvorschläge ?


    Gruß

  • Würde klappen^^ Auch wenn ich jetzt nicht direkt den Sinn in dieser Funktion sehe =/


    Ich persönlich würde es über reguläre Ausdrücke(Regex) machen, also etwa so:

    PHP
    1. <span class="syntaxdefault"></span><span class="syntaxkeyword">if(!</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"/[0-9](\.|,)[0-9]?/"</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $var</span><span class="syntaxkeyword">)){<br /></span><span class="syntaxdefault">echo </span><span class="syntaxstring">'Es steht keine 0 vor dem Komma, oder ihre Zahlenkette enthält einen/mehrere Buchstaben!'</span><span class="syntaxkeyword">;<br />}</span><span class="syntaxdefault"> else </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">echo </span><span class="syntaxstring">'Es steht eine 0 vor dem Komma'</span><span class="syntaxkeyword">;<br />}</span><span class="syntaxdefault"> </span>


    Meines hat wiederum den vorteil, dass auch Buchstaben in den Zeichenkentten erkannt werden :D
    Und es unterstütz auch ',' bei den Zeichenketten und es dürfen vor der 0 auch noch weitere Zahlen stehen, was bei dir ein Fehler wäre^^
    Oder es wäre kein Fehler, dann müsstest du bei mir einfach das erste [0-9] weg machen und stattdessen 0 schreiben (=


    Edit: kleiner Fehler im BB-Code
    Edit2: einige Rechtschreibfehler gefixt :D
    Edith3: xD Bevor ich hier gleich wieder einen drüber kriege einen Fehler/nicht-ganz-der-wahrheit-enstprechende-aussage-von-mir korrigiert (:

  • Kann mir mal bitte jemand erklären, wie die Suchmuster funktionieren? (oder eine Seite geben, auf der das steht?)
    Ich habe nirgends was dazu gefunden.


    Ich könnte jetzt sagen wie Sarkkans Suchmuster funktioniert (glaube ich), aber selber eins machen könnte ich nicht.


    Versuch Sarkkans zu erklären:

    &quot;Sarkkan&quot; schrieb:
    PHP
    1. <span class="syntaxdefault"><br /></span><span class="syntaxstring">"/[0-9](\.|,)[0-9]?/"<br /></span><span class="syntaxdefault"> </span>


    zwischen den Slashes kommt das eigentliche Suchmuster, "[Ziffer(n) zwischen 0 und 9][. oder ,][Ziffer(n) zwischen 0 und 9]"
    Wenn $var diesem Aufbau nicht entspricht wird das im if ausgeführt sonst else.
    Richtig?


  • Ganz genau, so ist es (=


    Als Seite empfehle ich persönlich Regex-Evaluator.de (=
    Zumindestens habe ich die gefunden, als ich einen Speziellen Ausdruck gesucht habe und schaue seit dem eigentlich immer dort^^
    "gelernt" habe ich das mit einer anderen Seite, wobei ich den größten Teil durch ausprobieren gelernt habe (=
    Den wenn man einmal das Prinzip heraus hat, sind Regex eigentlich einfach^^

  • Wenn ihr unbedingt eine Regex nutzen wollt dann macht es lieber so:


    PHP
    1. <span class="syntaxhtml"><br /><span class="syntaxdefault"><?php<br /><br /><br />   $string </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"27.12"</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">   if</span><span class="syntaxkeyword">(!</span><span class="syntaxdefault">is_numeric</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$string</span><span class="syntaxkeyword">))<br /></span><span class="syntaxdefault">   </span><span class="syntaxkeyword">{<br /><br /></span><span class="syntaxdefault">     print </span><span class="syntaxstring">'<p>Keine zul&auml;ssige Zahl.</p>'</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">   </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">   elseif</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'/\d\.(\d{1,27})/'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $string</span><span class="syntaxkeyword">))<br /></span><span class="syntaxdefault">   </span><span class="syntaxkeyword">{<br /><br /></span><span class="syntaxdefault">     print </span><span class="syntaxstring">'<p>Kommazahl.</p>'</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">   </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">   else<br />   </span><span class="syntaxkeyword">{<br /><br /></span><span class="syntaxdefault">     print </span><span class="syntaxstring">'<p>Keine Kommazahl.</p>'</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">   </span><span class="syntaxkeyword">}<br /><br /><br /></span><span class="syntaxdefault">?><br /></span></span>


    Ergebnis:


    27 = Keine Kommazahl,
    27.56 = Kommazahl,
    65. = Keine Kommazahl
    27.1a6/4 = Keine zulässige Zahl
    27.5 = Keine zulässige Zahl
    a.12 = Keine zulässige Zahl


    Erklärung des Suchmusters:


    Code
    1. / \d \. ( \d { 1 , 27} ) /
    2. Begrenzer beliebige Punkt beliebige mindestens maximal Begrenzer
    3. Zahl Zahl eine Zahl------27 Zahlen---nach dem komma
  • Tilgungsrechner - Kredit ( Wirtschaftsrechnen)


    Aufforderung zur Eingabe von Prozentwert
    2 Möglichkeiten

    • Integer
    • Float


    Beispiel:


    Eingabe in das (Prozente)Feld von einem Wert 5%

    • 5
    • 0.05 (wirtschafts mathematisch)



    wenn vor dem Komma keine Null -> dividieren durch 100


    Gruß


    Edit---
    float Abfrage nicht möglich^^
    5.5 = float
    muss aber trotzdem durch 100 geteilt werden

  • nicht wirklich^^


    ich brauch doch den Wert vor dem Komma
    nicht ob es eine Zahl mit Komma ist


    deswegen explode um die Kommazahl am Komma zu trennen
    den Wert von Array[0] verwende ich für die Bedingung


    mit preg_match finde ich doch "nur" raus ob das Komma im String/Float ist und es wird nicht die Zeichenkette vor dem Komma zurück geliefert


    oder hab ich da was falsch verstanden?


    Gruß

  • dann ersetzen wir preg_match durch preg_replace :p

    Code
    1. $Zahl_vor_Komma = preg_replace('/(\d)\.(\d{1,27})/', "$1", $var);


    Das was da rauß kommt ist die Zahl vor dem komma

  • Da empfiehlt sich doch tatsächlich deine Methode, du machst das jetzt einfach so:


    PHP
    1. <span class="syntaxhtml"><br /><span class="syntaxdefault"><?php<br /><br /><br /> $string </span><span class="syntaxkeyword">= </span><span class="syntaxstring">"27.12"</span><span class="syntaxkeyword">;<br /><br /> if(!</span><span class="syntaxdefault">is_numeric</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$string</span><span class="syntaxkeyword">))<br /> {<br /><br /> print </span><span class="syntaxstring">'<p>Keine zul&auml;ssige Zahl.</p>'</span><span class="syntaxkeyword">;<br /><br /> }<br /> elseif(</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'/\d\.(\d{1,27})/'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$string</span><span class="syntaxkeyword">))<br /> {<br /><br /> </span><span class="syntaxdefault">$zahlen </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'.'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$string</span><span class="syntaxkeyword">);<br /><br /> print </span><span class="syntaxstring">'<p>Zahl vor dem Komma: '</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">$zahlen</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">] .</span><span class="syntaxstring">'</p>'</span><span class="syntaxkeyword">;<br /> print </span><span class="syntaxstring">'<p>Zahl nach dem Komma: '</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">$zahlen</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">] .</span><span class="syntaxstring">'</p>'</span><span class="syntaxkeyword">;<br /><br /> }<br /> else<br /> {<br /><br /> print </span><span class="syntaxstring">'<p>Keine Kommazahl.</p>'</span><span class="syntaxkeyword">;<br /><br /> }<br /><br /><br /></span><span class="syntaxdefault">?><br /></span></span>


    Erst wird halt geprüft ob die Zahl überhaupt so aussieht wie du sie haben willst, und dann zerschneidest du sie mit explode und hast deine Zahlen.


    Wenn du beide Zahlen getrennt brauchst ist preg_replace nämlich Schwachsinn, da man daraus auch nur einen String basteln kann, und ihn dann exploden würde, also ein Schritt zuviel.


  • Hi, warum macht ihr das so umständlich? Einfach überprüfen,ob die Zahl zwischen 0 und 1 liegt, dann ist es eine Zahl ala 0,x. Wenn die Zahl größer-gleich 1 ist dann durch 100 teilen.


    Gruß Talwin

  • &quot;Sören&quot; schrieb:

    Das wäre von der Umständlichkeit her ungefähr genauso viel, wie seine erste Funktion.


    Ähh, nein. Einfach zwei numerische Vergleiche, anstatt unperformante String Operationen. Es sind ja schließlich Zahlen und keine Zeichenketten, die hier verarbeitet werden sollen. Leider hat PHP keine feste Typisierung und lässt solche Vergewaltigungen von Variablen zu...

  • Wenn mans so sieht, dann hast du Recht.
    Ich dachte eher an die Länge des Codes. Da würde sich nicht viel tun, wenn man die Zahl bei dem Punkt trennt und dann überprüft obs eine Null enthält.
    Oder guckt ob die Zahl größer-gleich Eins ist.

  • Naja, aber die "Länge" eines Codestücks gibt doch nicht Aufschluss über die Qualität des Codes, geschweige denn über die Aufwendigkeit. Wenn man es genau nimmt, fehlen da: Überprüfung des Arguments, falls keine Zahl, Exception schmeißen (der aufrufende Codeteil muss diese auffangen und verarbeiten, in einem try-catch Block), dann prüfen, ob Zahl über Null, falls nein, Exception schmeißen etc.
    Das wäre dann eine saubere Funktion

  • &quot;Talwin&quot; schrieb:

    Naja, aber die "Länge" eines Codestücks gibt doch nicht Aufschluss über die Qualität des Codes, geschweige denn über die Aufwendigkeit.


    Das hab ich ja nicht behauptet. Hab dich wohl falsch verstanden.

  • Das problem so ist zwar gelöst, aber gibt es da nicht noch einen kleinen Logik fehler..


    Was ist wenn der user 0.5% ausrechnen will.. Denn dann würde dein Rechner bei einer eingabe von 0.5 ja 50% nehmen..


    Oder sehe ich das falsch ?


    Greetz TimTim