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

bianca
 2012-01-14 17:28
#155441 #155441
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Habe das ganze mal in aller Ruhe als sub gebaut.
Anbei der Code inkl. Tests.
Sieht soweit gut aus. Habe auch noch zwei oder drei Fehler korrigiert.
Und das int() habe ich ganz rausgenommen, weil ja inzwischen bekannt ist, wie zuverlässig das arbeitet.. Weiß auch nicht genau, wofür das drin war.
Sieht noch jemand grobe Fehler?

Danke nochmal an topeg für die Grundlage!
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/perl
use strict;
use warnings;

foreach (
    # Aufbau: Eingabe|Erwartetes_Ergebnis
    '|undef',
    '0|undef',
    '0000000|undef',
    '1|eins',
    '2|zwei',
    '3|drei',
    '4|vier',
    '5|fünf',
    '6|sechs',
    '7|sieben',
    '8|acht',
    '9|neun',
    '10|zehn',
    '11|elf',
    '12|zwölf',
    '13|drei-zehn',
    '14|vier-zehn',
    '15|fünf-zehn',
    '16|sech-zehn',
    '17|sieb-zehn',
    '18|acht-zehn',
    '19|neun-zehn',
    '20|zwanzig',
    '21|ein-und-zwanzig',
    '21.23|undef',
    '32|zwei-und-dreißig',
    '40|vierzig',
    '43|drei-und-vierzig',
    '50|fünfzig',
    '55|fünf-und-fünfzig',
    '60|sechzig',
    '70|siebzig',
    '-73|undef',
    '80|achtzig',
    '90|neunzig',
    '100|ein-hundert',
    '9999|neun-tausend-neun-hundert-neun-und-neunzig',
    '00000009999|neun-tausend-neun-hundert-neun-und-neunzig',
    '511246798152931312488625|fünf-hundert-elf-trilliarden-zwei-hundert-sechs-und-vierzig-trillionen-sieben-hundert-acht-und-neunzig-billiarden-ein-hundert-zwei-und-fünfzig-billionen-neun-hundert-ein-und-dreißig-milliarden-drei-hundert-zwölf-millionen-vier-hundert-acht-und-achtzig-tausend-sechs-hundert-fünf-und-zwanzig',
) {
    my @paras = split /\|/,$_;
    my $rueck = zifferzuwort ($paras[0]);
    print "." . ((!defined $rueck && $paras[1] eq 'undef') || (defined $rueck && $rueck eq $paras[1]) ? '' : "\n'$paras[0]' FEHLER!!!" . chr(7) . "\n$rueck\nstatt\n$paras[1]\n");
}

###############################################################################

sub zifferzuwort {
    #
    # Quelle: https://www.perl-community.de/bat/poard/thread/17058#ms_155406
    # Stellt eine Zahl als Wort dar, z.B. für Quittungen.
    # Verarbeitet nur Ziffern, keine Nachkommastellen, keine Vorzeichen!
    # Liefert undef im Fehlerfall.
    #
    # Aufruf:
    # =======
    # print "12 -> ".zifferzuwort(12);
    #
    my %conf = (
        eins                        => [qw(ein eine eins)],
        null_zwoelf                 => [qw(null ein zwei drei vier fünf sechs sieben acht neun zehn elf zwölf)],
        sonder                      => {
            16 => "sech-zehn",
            17 => "sieb-zehn"
        },
        zehn_neunzig                => [qw(null zehn zwanzig dreißig vierzig fünfzig sechzig siebzig achtzig neunzig)],
        und                         => 'und',
        hundert_billiarde           => [qw(hundert tausend million milliarde billion billiarde trillion trilliarde)],
        hundert_billiarde_anhang    => ['','',qw(en n en n en n)],
    );
    my $wert=shift;
    return undef if !defined $wert || $wert=~/[^\d]/;
    $wert=~s/^0//g while $wert=~/^0/;
    return undef if $wert eq '';
    my @list=split(/(?<=\d)(?=(?:\d{3})+$)/,$wert);
    my $back='';
    for my $cnt (0..$#list) {
        my $val=$list[$cnt];
        my $mi=$conf{hundert_billiarde}[$#list-$cnt];
        my $re='';
        if($#list-$cnt>0) {
            if($val>1) {
                $mi.=$conf{hundert_billiarde_anhang}[$#list-$cnt];
                $re=_hundert($val,\%conf)."-".$mi;
            }
            elsif($val==1) { $re=$conf{eins}[$#list-$cnt>1?1:0]."-".$mi; }
        }
        else { $re=_hundert($val,\%conf); }
        $back.="-".$re;
    }
    $back=~s/-+/-/g;
    $back=~s/^-+//g;
    $back=~s/-+$//g;
    return $back;
    sub _hundert {
        my ($val,$conf)=@_;
        my $ret='';
        if($val<99) { $ret=_zehn($val,$conf); }
        else {
            my $f=substr($val,0,1,'');
            if($f==1) { $f=$conf->{eins}[0]."-".$conf->{hundert_billiarde}[0]; }
            else { $f=$conf->{null_zwoelf}[$f]."-".$conf->{hundert_billiarde}[0]; }
            $ret=$f."-"._zehn($val,$conf);
        }
        return $ret;
    }
    sub _zehn {
        my ($val,$conf)=@_;
        my $ret='';
        return '' if($val<=0);
        if($val<13) {
            if($val==1) { $ret=$conf->{eins}[2]; }
            else { $ret=$conf->{null_zwoelf}[$val]; }
        }
        elsif(exists($conf->{sonder}{$val})) { $ret=$conf->{sonder}{$val}; }
        else {
            my $pre=substr($val,0,1,'');
            my $prepre=$conf->{null_zwoelf}[$val];
            $ret=($val?$prepre.'-'.($pre>1?$conf->{und}.'-':''):'').$conf->{zehn_neunzig}[$pre];
        }
        return $ret;
    }
}
10 print "Hallo"
20 goto 10

View full thread Zahlen in Worten