package ZahlZuWort; use strict; use warnings; use utf8; my @eins=qw(ein eine eins); my @null_zwoelf=qw(null ein zwei drei vier fünf sechs sieben acht neun zehn elf zwölf); my @zehn_neunzig=qw(null zehn zwanzig dreißig vierzig fünfzig sechzig siebzig achtzig neunzig); my $und='und'; my @hundert_billiarde= qw(hundert tausend million milliarde billion billiarde trillion); my @hundert_billiarde_anhang=("", "",qw( en n en n en)); #################################### # # use ZahlZuWort; # $string=ZahlZuWort::format($zahl); # #################################### sub format { my $wert=shift; $wert=~s/\D//gs; return undef if($wert!~/^\d+$/); #return undef if($wert+0 > 999999999999999); my @list=split(/(?<=\d)(?=(?:\d{3})+$)/,$wert); my $back=''; for my $cnt (0..$#list) { my $val=$list[$cnt]; my $mi=$hundert_billiarde[$#list-$cnt]; my $re=''; if($#list-$cnt>0) { if($val>1) { $mi.=$hundert_billiarde_anhang[$#list-$cnt]; $re=_hundert(int($val))."-".$mi; } elsif($val==1) { $re=$eins[$#list-$cnt>1?1:0]."-".$mi; } } else { $re=_hundert(int($val)); } $back.="-".$re; } $back=~s/-+/-/g; $back=~s/^-+//g; $back=~s/-+$//g; return $back; } sub _hundert { my $val=shift; my $ret=''; if($val<99) { $ret=_zehn($val); } else { my $f=substr($val,0,1,''); if($f==1) { $f=$eins[0]."-".$hundert_billiarde[0]; } else { $f=$null_zwoelf[$f]."-".$hundert_billiarde[0]; } $ret=$f."-"._zehn($val); } return $ret; } sub _zehn { my $val=shift; my $ret=''; return '' if($val<=0); if($val<13) { if($val==1) { $ret=$eins[2]; } else { $ret=$null_zwoelf[$val]; } } else { my $pre=substr($val,0,1,''); my $prepre=$null_zwoelf[$val]; $ret=($val?$prepre.'-'.($pre>1?$und.'-':''):'').$zehn_neunzig[$pre]; } return $ret; } 1;