Andreas Cloos: ereg_replace() oder preg_replace() will nicht

Hallo Zusammen,

das ist das letzte, was ich für mein Projekt noch brauche: die Umwandlung von Ziffern a la 40.00 in "Vierzig" oder in "vier null, null, null" was ja einfacher ist (Auf einer Spendenbescheinigung muß der Betrag auch in Worten stehen :-(  ):

Probeweise habe ich mal eine Buchung mit Betrag 40.00 genommen und versuche also den String zu transformieren. Mein Code sieht aus wie folgt:

$i = $zeile[6];

switch ($i) {
    case 0 :
        ereg_replace("/0/", "null", $i);
    case 4 :
        ereg_replace("/4/", "vier", $i);
    }

echo $i;

Und was kommt hier raus: 40.00.

Hat jemand eine Idee?

--
Greetz,
Andreas

  1. Huhu Andreas

    ereg_replace("/4/", "vier", $i);
       echo $i;
    Hat jemand eine Idee?

    ja, da fehlt noch die Zuweisung, da ereg_replace den "Arbeitsstring" unverändert lässt. Also

    $i= ereg_replace("/4/", "vier", $i);

    Gute Nacht

    lulu

  2. Huhu one more time

    das ist das letzte, was ich für mein Projekt noch brauche: die Umwandlung von Ziffern a la 40.00 in "Vierzig" oder in "vier null, null, null" was ja einfacher ist (Auf einer Spendenbescheinigung muß der Betrag auch in Worten stehen :-(  ):

    Mit preg_replace kannst Du auch arrays einsetzen und damit alle Zahlen auf einmal "erschlagen".

    <?php
    $i='1243.00,- DM';
    $pattern=array('/0/','/1/','/2/','/3/','/4/');
    $replacements=array('null','eins','zwei','drei','Vier');
    $i=preg_replace($pattern,$replacements, $i);
    echo $i;
    ?>

    wobei ich die Variante mit "vierzig" irgendwie schmissiger als vier-null finde.
    Kann eigentlich nicht so schwierig sein, da werde ich mal was basteln .... nein, nicht mehr heute, oder etwa doch ...

    Gute Nacht (jetzt aber wirklich)

    lulu

    1. Hi lulu,

      wobei ich die Variante mit "vierzig" irgendwie schmissiger als vier-null finde.
      Kann eigentlich nicht so schwierig sein,

      Finde ich auch netter, aber hast Du mal an Spenden wie 1.235.678,89 Eur gedacht? Hm...

      Greetz,
      Andreas

      1. Huhu Andreas

        Finde ich auch netter, aber hast Du mal an Spenden wie 1.235.678,89 Eur gedacht? Hm...

        hui, ich maile Dir gleich mal meine Kontonummer ;-)

        Also ich dachte so an Zahlen bis 1.000.000.000,-
        das wird dann natürlich ein Bandwurmwort aber ist dann von der Umsetzung auch nicht schwiergiger als z.B. nur bis Zweitausenddreihundertundsiebenundzwanzig.

        Die Pfennige bzw. Cents (ich hab mich immer noch nicht daran gewöhnt *seufz*) werden ja üblicherweise nicht berücksichtigt.

        Viele Grüße

        lulu

        1. Hi lulu, gerade auf http://www.phpbuilder.com/ gefunden:

          <? /****************************************   numToString(int $number);

          Author: Chris Heald   Email: cheald45@hotmail.com   Creation date: 1/9/02

          License: No restriction, provided this header is left intact. You may     change the purpose if you update the code - leave the author, email,     creation date, license, and changelog intact. You may append to the     changelog as you make changes.

          Purpose:   Use to convert a numeric number to a literal string equivalent.   ie: numToString(10) returns "ten".   As of right now, it works for any number up   to 999,999,999,999,999,999,999,999.999999999 - if you need more than that,   add to the $places array.

          Possible future enhancements:     Multiple languages. I might be able to get some Spanish done, but other     than that, I'm out of luck. If anyone wants to adapt language files, please     feel free. I'm sure the logic will have to be changed, too.

          I needed this for a personal site, and thought I'd share it. Please feel free   to expand or enhance it, and feel free to email me if you have questions.

          *** Change Log ***   01/08/02 - CMH     Created File. Version 1.00   01/16/02 - CMH     Fixed problem with numbers between 14 and 19 being translated as "teen four", "teen five", etc.     Fixed lack of commas in places after the decimal.     Fixed lack of place notation after the decimal.     Fixed lack of dashes in numbers after the decimal.   ****************** ****************************************/ function numToString($number) {   global $single, $hundred, $odd, $tens;   $return = "";   $single = array (           "1"        =>        "one",           "2"        =>        "two",           "3"        =>        "three",           "4"        =>        "four",           "5"        =>        "five",           "6"        =>        "six",           "7"        =>        "seven",           "8"        =>        "eight",           "9"        =>        "nine",           "0"        =>        "zero"   );   $hundred        =        "hundred";   $places = array (           "0"        =>        "",           "1"        =>        "thousand",           "2"        =>        "million",           "3"        =>        "billion",           "4"        =>        "trillion",           "5"        =>        "quadrillion",           "6"        =>        "quintillion",           "7"        =>        "sextillion"   );   $tens = array (           "1"        =>        "teen",           "2"        =>        "twenty",           "3"        =>        "thirty",           "4"        =>        "forty",           "5"        =>        "fifty",           "6"        =>        "sixty",           "7"        =>        "seventy",           "8"        =>        "eighty",           "9"        =>        "ninety"   );   $odds = array (           "10"        =>        "ten",           "11"        =>        "eleven",           "12"        =>        "twelve"   );   if(!is_numeric($number))     return false;   $parts = explode(".",$number);   $number = $parts[0];   $decimal = @$parts[1];   if(@!$number)     $return = "zero ";   if(@!$decimal)     $decimal = 0;   $place = floor(strlen($number) / 3);   $remainder = 3 - (strlen($number) % 3);   $number = str_pad($number,($place * 3 == 0 ? 3 : $place * 3), "0", STR_PAD_LEFT);   while(strlen($number) > 0) {     $sets[@++$i] = substr($number,strlen($number) - 3, 3);     $number = substr($number,0,strlen($number) - 3);   }   $setno = 0;   $sets = array_reverse($sets);   foreach($sets as $set) {     $set = str_pad($set,3, "0", STR_PAD_LEFT);     $p1 = substr($set,0,1);     $p2 = substr($set,1,2);     if(substr($set,0,1) != "0")       $return .= $single[$p1] . " " . $hundred . " ";     $add = "";     if(@$odds[$p2])       $return .= $odds[$p2] . " ";     else {       if(substr($p2,0,1) != "0") {         if(substr($p2,0,1) == "1")           $add = "teen";         else           $return .= $tens[substr($p2,0,1)] . (substr($p2,1,1) == 0 ? " " : "-");       }       if(substr($p2,1,1) != "0")         $return .= $single[substr($p2,1,1)] . "$add ";     }     $return .= $places[sizeof($sets) - $setno - 1] . ", ";     $setno++;   }   $return = eregi_replace(", $","",$return);   if($decimal) {     $return .= "and ";     $number = "$decimal";     $place = floor(strlen($number) / 3);     $remainder = 3 - (strlen($number) % 3);     $number = str_pad($number,$place * 3, "0", STR_PAD_LEFT);     $sets = array();     $i = 0;     while(strlen($number) > 0) {       $sets[@++$i] = substr($number,strlen($number) - 3, 3);       $number = substr($number,0,strlen($number) - 3);     }     $setno = 0;     $sets = array_reverse($sets);     foreach($sets as $set) {       $set = str_pad($set,3, "0", STR_PAD_LEFT);       $p1 = substr($set,0,1);       $p2 = substr($set,1,2);       if(substr($set,0,1) != "0")         $return .= $single[$p1] . " " . $hundred . " ";       if(@$odds[$p2])         $return .= $odds[$p2] . " ";       else {         $add = "";         if(substr($p2,0,1) != "0")           if(substr($p2,0,1) == "1")             $add = "teen";           else             $return .= $tens[substr($p2,0,1)] . (substr($p2,1,1) == 0 ? " " : "-");;         if(substr($p2,1,1) != "0")           $return .= $single[substr($p2,1,1)] . "$add ";       }       $return .= $places[sizeof($sets) - $setno - 1] . ", ";       $setno++;     }     $size = strlen($decimal) == 1 ? "ten" : $places[strlen($decimal)-2];     $return = eregi_replace(" , $"," ",$return);     $return .= $size . "th";     if(@$decimal != "1")       $return .= "s";   }   return ucfirst($return); }

          Das löst (hopefully) alle meine Probleme! Und verschafft Dir ein freies Wochenende, falls Du das echt vorhattest.

          -- Greetz, Andreas

          1. Huhu Andreas

            böser Spielverderber :-(

            ok ich schau es mir mal an.

            Das löst (hopefully) alle meine Probleme! Und verschafft Dir ein freies Wochenende, falls Du das echt vorhattest.

            Ich bin gerade mittendrin und grübele über der Frage ob es "Einhunderteins" oder "Einhundertundeins" heissen muss.

            Viele Grüße

            lulu

            1. Hi lulu,

              böser Spielverderber :-(

              Sorry.

              Ich bin gerade mittendrin und grübele über der Frage ob es "Einhunderteins" oder "Einhundertundeins" heissen muss.

              Ich bin für Einhundertundeins.

              --
              Greetz,
              Andreas

  3. Huhu Andreas

    Neunhundertneunundneunzigmilliardenneunhundertneunundneunzigmillionenneunhundertneunundneunzigtausendneunhundertneunundneunzig
    oder 999999999999
    das ist z.Zt. die größte Zahl welche mein kleines Skript "transformieren" kann.
    Sollte für normale Spendenbeträge reichen (keine Parteispenden).
    Ist sicherlich noch verschönerungs+verbesserungswürdig aber fürs erste soll es das mal gewesen sein, hat jedenfalls Spass gemacht.

    Viele Grüße

    lulu

    <?php

    function get_zehner($n)
    {
         $zahlwoerter=array('null','ein','zwei','drei','vier','fünf','sechs','sieben','acht','neun','zehn','elf','zwölf');

    $n=abs(floor($n)); # nur ganze positive Zahlen
     if($n>99) return $n; # max 99

    // Zahlen bis 12
     if($n<13){
      $zahlwoerter[1]='eins';
       return $zahlwoerter[$n];
     }
      // Zahlen bis 19
     if($n<20){
      $zahlwoerter[6]='sech';
      $zahlwoerter[7]='sieb';
       return $zahlwoerter[($n-10)].'zehn';
     }
      // Zahlen bis 99
     if($n<100){
      $zehner=floor($n/10);
      $einer=$n-$zehner*10;
      $einer_wert=$einer>0?$zahlwoerter[$einer].'und':'';
      $zahlwoerter[2]='zwan';
      $zahlwoerter[6]='sech';
      $zahlwoerter[7]='sieb';
      $zehner_wert=$zahlwoerter[$zehner].($zehner==3?'ßig':'zig');
       return $einer_wert.$zehner_wert;
     }
     return $n;
    }

    function get_hundert($n)
    {
     $n=abs(floor($n)); # nur ganze positive Zahlen
     if($n>999) return $n; # max 999

    $hunderter=floor($n/100);
     $rest=$n-$hunderter*100;
     if($hunderter>0){
      $hunderter_wert=( $hunderter==1?'ein':get_zehner($hunderter) ).'hundert';
     }
     $rest_wert=$rest>0?get_zehner($rest):'';
     return $hunderter_wert.$rest_wert;
    }

    function zahlwort($n)
    {
     $n=abs(floor($n)); # nur ganze positive Zahlen
     $l=strlen($n);
     $einer=get_zehner(substr($n,-2) );
     if($l>2){
      $hdt=substr($n,-3) ;
      $hunderter_wert=get_hundert($hdt);
      $einer='';
     }
     if($l>3){
      $tsd=substr($n,-6,-3) ;
      if($tsd>0){
       $tausender_wert=get_hundert($tsd).'tausend';
      }
     }
     if($l>6){
      $mio=substr($n,-9,-6) ;
      if($mio>0){
       $mio_wert=( $mio==1?'eine':get_hundert($mio)).'million'.($mio>1?'en':'');
      }
     }
     if($l>9){
      $mia=substr($n,-12,-9) ;
      if($mia>0){
       $mia_wert=( $mia==1?'eine':get_hundert($mia)).'milliarde'.($mia>1?'n':'');
      }
     }
     return sprintf('%s%s%s%s%s',$mia_wert,$mio_wert,$tausender_wert,$hunderter_wert,$einer);
    }

    function zahl_ausschreiben($n)
    {
     return ucfirst(zahlwort($n));
    }

    for($i=0;$i<100;$i++){
     $n=$i*1;

    printf ('%s -> %s<br>',$n,zahl_ausschreiben($n));
    }

    echo zahl_ausschreiben(999999999999);
    ?>