ereg_replace() oder preg_replace() will nicht
Andreas Cloos
- php
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
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
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
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
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
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
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
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
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);
?>