Thread Zahlen in Worten (9 answers)
Opened by bianca at 2012-01-11 15:25

topeg
 2012-01-11 17:11
#155392 #155392
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich hatte bei einer Fortbildung so was aus Langeweile geschrieben:

more (19.6kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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;

Das ist aber nur ein Hack. Benutze lieber ein Modul von Cpan. :-)

View full thread Zahlen in Worten