führende Nullen bei PLZ verarbeiten
analogbernd
- php
1 EKKi0 analogbernd0 Vinzenz Mai0 analogbernd0 Sven Rautenberg
2 MudGuard
0 Siechfred
Hallo,
ich möchte Postleitzahlen verarbeiten. Leider funktioniert dies nicht wie gewünscht. Die gewünscht Einschränkung soll Postleitzahlen bspw. von 09997 bis 09999 ergeben. Mit > 99999 AND <99999 funktioniert es reibungslos. Also vermute ich mal, es liegt an den führenden Nullen des gewünschten PLZ-Bereiches.
Die Forensuche (Link)
führte leider nicht zum Treffer.
Wie stelle ich es an, das eine PLZ mit einer führenden Null (09997) als ganze Zahl betrachtet wird?
Die Abfrage sieht wie folgt aus :
if ($plz_array[entry_country_id] == 81 AND (int)$plz_array[entry_postcode] > 99997 AND (int)$plz_array[entry_postcode] < 99999 )
und funktioniert, aber eben nur mit PLZ ohne Null am Anfang.
Vielen Dank.
Mahlzeit analogbernd,
ich möchte Postleitzahlen verarbeiten. Leider funktioniert dies nicht wie gewünscht. Die gewünscht Einschränkung soll Postleitzahlen bspw. von 09997 bis 09999 ergeben. Mit > 99999 AND <99999 funktioniert es reibungslos. Also vermute ich mal, es liegt an den führenden Nullen des gewünschten PLZ-Bereiches.
Behandle Postleitzahlen nicht als numerische Werte, sondern als Strings (das bietet sich um Hinblick auf evtl. Internationalisierung sowieso an).
MfG,
EKKi
Mahlzeit analogbernd,
Behandle Postleitzahlen nicht als numerische Werte, sondern als Strings (das bietet sich um Hinblick auf evtl. Internationalisierung sowieso an).
MfG,
EKKi
Danke für die schnelle Antwort,
wie soll diese Behandlung aussehen? Es sind ziemlich viele Postleitzahlen, deswegen auch der Vergleich bzw. die Einschränkung von .. bis ...
Würde ich es so machen, müsste die Abfrage doch so lauten:
if ($plz_array[entry_country_id] == 81 AND $plz_array[entry_postcode] == "99997" OR $plz_array[entry_postcode] == "99998" OR $plz_array[entry_postcode] == "99999" )
Bei drei PLZ soweit ok, aber es sind ja nicht nur drei.. ??????
Danke
Hallo,
Behandle Postleitzahlen nicht als numerische Werte, sondern als Strings (das bietet sich um Hinblick auf evtl. Internationalisierung sowieso an).
Danke für die schnelle Antwort,
wie soll diese Behandlung aussehen?
Fast genauso wie vorher, nur solltest Du >= und <= nehmen, statt < und >.
Würde ich es so machen, müsste die Abfrage doch so lauten:
Nein, wieso?
if ($plz_array[entry_country_id] == 81 AND $plz_array[entry_postcode] == "99997" OR $plz_array[entry_postcode] == "99998" OR $plz_array[entry_postcode] == "99999" )
Das ist Unsinn.
Bei drei PLZ soweit ok, aber es sind ja nicht nur drei.. ??????
Zeichenkettenvergleiche funktionieren wunderbar und liefern selbstverständlich das erwartete Ergebnis. Wo ist das Problem?
Freundliche Grüße
Vinzenz
Zeichenkettenvergleiche funktionieren wunderbar und liefern selbstverständlich das erwartete Ergebnis. Wo ist das Problem?
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
vielen Dank. Du hast Recht. Ich bin sicherlich etwas verwirrt gewesen ;)
Es funktiniert natürlich wie folgt:
if ($plz_array[entry_country_id] == 81 AND (int)$plz_array[entry_postcode] >= "99997" AND (int)$plz_array[entry_postcode] <= "99999" )
;)
Problem gelöst..
Moin!
Es funktiniert natürlich wie folgt:
Nein, der Code ist fehlerhaft!
if ($plz_array[entry_country_id] == 81 AND (int)$plz_array[entry_postcode] >= "99997" AND (int)$plz_array[entry_postcode] <= "99999" )
Durch das explizite (int) provozierst du die Wandlung des Strings in eine Zahl. Dabei geht dir die führende Null verloren. Dann erfolgt der Vergleich mit einem String.
Zwei Möglichkeiten bestehen: Entweder wird die Zahl zurück zum String gewandelt, oder der String zur Zahl. Beide Ergebnisse führen nicht zum Ziel.
Nur mal angenommen, es geht um die Postleitzahl "09999". Die wird als Zahl zu 9999, und nur, weil deine Postleitzahlendefinition so "eng" ist (fünfte Ziffer von 7 bis 9), kann die Zahl nicht in den gewünschten Bereich fallen.
Hättest du einen etwas weiter gefaßten Bereich gewählt, wie z.B. "zwischen 99800 und 99999", wäre beim Stringvergleich "9999" innerhalb des Bereichs.
Problem gelöst..
Noch nicht, weil dir die Randbedingungen Korrektheit vortäuschen, aber das Grundproblem immer noch existiert: Postleitzahlen sind keine Zahlen und sollen auch nicht als solche behandelt werden.
- Sven Rautenberg
Hi,
if ($plz_array[entry_country_id] == 81 AND (int)$plz_array[entry_postcode] >= "99997" AND (int)$plz_array[entry_postcode] <= "99999" )
Durch das explizite (int) provozierst du die Wandlung des Strings in eine Zahl. Dabei geht dir die führende Null verloren. Dann erfolgt der Vergleich mit einem String.
Wird dabei die führende 0 nicht dazu führen, daß der String als Oktalzahl interpretiert wird?
(hab grad keine Möglichkeit, hier PHP zu installieren, und nur um das auszuprobieren ...)
cu,
Andreas
Wird dabei die führende 0 nicht dazu führen, daß der String als Oktalzahl interpretiert wird?
Wenn der String in Anführungszeichen steht, nicht, ausserhalb ja.
Wird dabei die führende 0 nicht dazu führen, daß der String als Oktalzahl interpretiert wird?
Wenn der String in Anführungszeichen steht, nicht, ausserhalb ja.
Na nun bin ich ja ganz verwirrt ;)
Was ist demnach also zu tun? Hat jemand einen Tipp oder wenigstens nen Link zum belesen?
Vielen Dank
Moin!
Wird dabei die führende 0 nicht dazu führen, daß der String als Oktalzahl interpretiert wird?
Wenn der String in Anführungszeichen steht, nicht, ausserhalb ja.
Na nun bin ich ja ganz verwirrt ;)
Was ist demnach also zu tun? Hat jemand einen Tipp oder wenigstens nen Link zum belesen?
Einige:
1. Der allererste Schritt in deinem Code wäre, das (int) wegzulassen, denn das sorgt für die Garantie, dass der String in der Variablen in eine Zahl verwandelt wird.
2. Allerdings: In PHP werden Vergleiche zwischen zwei numerischen Strings oder einem String und einer Zahl immer als Zahlenvergleich durchgeführt. "01234" wird als Zahl 1234 behandelt. Das Weglassen von (int) ändert also nichts am grundsätzlichen Fehler des Codes, der die führende Null nicht beachtet.
3. Zum Zeichenvergleichen zweier Strings nutze die Funktion strcmp().
- Sven Rautenberg
Hallo,
- Zum Zeichenvergleichen zweier Strings nutze die Funktion strcmp().
- Sven Rautenberg
vielen Dank. Ich habe das jetzt so und "scheinbar" funktioniert es auch.
if ($plz_array[entry_country_id] == 81 AND strcmp ( $plz_array[entry_postcode] , "99997" ) >= 0 AND strcmp ( $plz_array[entry_postcode] , "99999" ) <=0 )
Ist das jetzt so richtig oder wenn nicht: bin ich auf dem richtigen Weg? Was wäre dann der nächste Schritt?
Vielen Dank
Moin!
Hallo,
- Zum Zeichenvergleichen zweier Strings nutze die Funktion strcmp().
- Sven Rautenberg
vielen Dank. Ich habe das jetzt so und "scheinbar" funktioniert es auch.
if ($plz_array[entry_country_id] == 81 AND strcmp ( $plz_array[entry_postcode] , "99997" ) >= 0 AND strcmp ( $plz_array[entry_postcode] , "99999" ) <=0 )
Ist das jetzt so richtig oder wenn nicht: bin ich auf dem richtigen Weg? Was wäre dann der nächste Schritt?
Aus meiner Sicht ist dein Code jetzt "besser".
Allerdings: Wenn du mehr Sicherheit haben willst, solltest du (damit wären wir bei "nächster Schritt") drüber nachdenken, a) diesen PLZ-Vergleich in eine eigene Funktion einzubetten, die dann im if aufgerufen wird, und b) in einer eigenen Datei einfach mal diverse Tests zu programmieren, die mit definierten Daten sowohl für die PLZ-Grenzen als auch die gesuchte PLZ diese neue Funktion aufrufen und das Ergebnis mit deiner Ergebnisvorgabe vergleicht.
Sprich: Die Funktion kriegt drei Parameter ($such, $unten, $oben) und liefert als Ergebnis true ($such ist innerhalb der Grenzen von $unten und $oben) oder false (ist außerhalb).
Möglicher Testaufruf:
echo "Test Nr. 1: ", (plzsuche("01234","01000", "02000") ? "korrekt" : "nicht korrekt"), "\n";
echo "Test Nr. 2: ", (plzsuche("01234","02000", "03000") ? "nicht korrekt" : "korrekt"), "\n";
Mit einem netten Test-Framework wie "SimpleTest" könnest du dir einiges der überflüssigen Schreibarbeit so einer selbstgebauten Lösung einsparen, allerdings zielt das Framework eher auf objektorientiertes Programmieren, sprich: Wenn man damit nur Funktionen testen will, und mit OOP nicht viel am Hut hat, könnte es sich eher als Klotz am Bein erweisen. Andererseits: Vielleicht kriegt man damit auch einen netteren Einstieg in OOP hin.
- Sven Rautenberg
Hi,
ich möchte Postleitzahlen verarbeiten. Leider funktioniert dies nicht wie gewünscht. Die gewünscht Einschränkung soll Postleitzahlen bspw. von 09997 bis 09999 ergeben. Mit > 99999 AND <99999 funktioniert es reibungslos. Also vermute ich mal, es liegt an den führenden Nullen des gewünschten PLZ-Bereiches.
Behandle Postleitzahlen nicht als Zahlen, sondern als Strings.
cu,
Andreas
ich möchte Postleitzahlen verarbeiten. Leider funktioniert dies nicht wie gewünscht. Die gewünscht Einschränkung soll Postleitzahlen bspw. von 09997 bis 09999 ergeben. Mit > 99999 AND <99999 funktioniert es reibungslos. Also vermute ich mal, es liegt an den führenden Nullen des gewünschten PLZ-Bereiches.
Entferne die führenden Nullen, sofern vorhanden, und führe dann einen Zahlenvergleich durch.
Siechfred