phpbar.de logo

Mailinglisten-Archive

AW: [php] Zahlenformat konvertieren deutsch -> englisch

AW: [php] Zahlenformat konvertieren deutsch -> englisch

Andre Steffens php_(at)_phpcenter.de
Mon, 19 Nov 2001 23:16:55 +0100


>Ich kaeme z.B. nie auf die Idee, einen User ein Datum
eingeben zu lassen, da kommt nur Murks raus.

Warum nicht, dafür schreibt man sich eine nette kleine Funktion und evoila,
der User sollte nur irgendein genormtes Format angeben, welches, das erkennt
PHP von selbst. Den geprüften bzw. korrigierten Wert zeigt man dem User
nochmals an damit notfalls er derjenige ist welcher den "Fehler" zu
verantworten hat - und fertig !!!

Wir verarbeiten bei uns Adressen und prüfen alles was nicht "Niet und Nagel"
fest ist. Bei ca. 15.000 neuen Daten täglich wäre eine Sichtprüfung ohnehin
"für'n Arsch"...


Anbei beschriebene Funktion (reicht zumindest für die gängigen Formate).
Notfalls könnte man auch das Eingangsformat noch einbauen und die Ausgabe
läßt sich natürlich auch noch nach Herzenzlust bearbeiten...

Viel Spaß damit und jetzt mach ich wirklich Feierabend!


# Prüft ein Datum und gibt es im gewünschten Format zurück
function get_date($datum,$out,$nocheck)
  {
  if (!$out) $out = "Y-m-d";
  $datum = ereg_replace("[^0-9\.-]","",$datum);

  if ($datum)
     {
     # TT.MM.JJJJ
     if (preg_match("=\.=",$datum))
        $tmp = split("\.",$datum);
     # JJJJ-MM-TT
       else if (preg_match("=-=",$datum))
        $tmp = array_reverse(split("-",$datum));
     # TTMMJJJJ
       else
        {
        $tmp[0] = substr($datum,0,2);
        $tmp[1] = substr($datum,2,2);
        $tmp[2] = substr($datum,4,4);
        }
     }

  if ($tmp)
     {
     # geb. Datum 2 Stellig
     if (strlen($tmp[2]) < 3)
        {
        if ($tmp[2] > date("y")) $tmp[2] = '19'.set($tmp[2],n,2);
          else $tmp[2] = '20'.set($tmp[2],n,2);
        }

     $tmp[0] = set($tmp[0],n,2);
     $tmp[1] = set($tmp[1],n,2);
     $tmp[2] = set($tmp[2],n,4);

     # Tag ungültig
     $max = date("t", mktime(0,0,0,$tmp[1]));
     if ($tmp[0] > $max) $tmp[0] = $max;

     # Datum in der Zukunft => -100 Jahre
     if (!$nocheck && date("Ymd") < $tmp[2].$tmp[1].$tmp[0]) $tmp[2] -= 100;

     # Rückgabe wenn Datum korrekt oder keine Prüfung gewünscht
     if ($nocheck || checkdate($tmp[1],$tmp[0],$tmp[2]))
        {
        $pattern = array("=d=","=m=","=Y=","=y=");
        $replace = array($tmp[0],$tmp[1],$tmp[2],substr($tmp[2],2,2));
        return preg_replace($pattern,$replace,$out);
        }
     }
  }


NACHTRAG:
Wie ich auf den Schwachsinn mit Pattern und Replace kam weiß ich selbst
nicht mehr, werf ich definitiv raus und ersetze es durch mktime() und date()
...



php::bar PHP Wiki   -   Listenarchive