Thread Kaufmännisch korrekt runden (67 answers)
Opened by bianca at 2009-12-11 07:14

bianca
 2009-12-13 14:26
#129297 #129297
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2009-12-13T13:18:56 topeg
Ich habe da eine auskommetierte "sprintf"-Zeile, die sollte das Problem beheben, da es die "kaputten" Stellen abschneidet. (dann kann man sich auch das "+0" beim "return" sparen.)

Hab ich probiert, dann wird hinter dem Komma mit Nullen aufgefüllt bis Stellenzahl erreicht ist. Ich glaub, am Ende nehme ich doch lieber meinen eigenen Ansatz, der macht auch diesen Fall richtig.

Inzwischen sieht mein Ansatz so aus, kann man vielleicht noch geschwindigkeitsoptimieren, ist aber bei sämtlichen Werten fehlerfrei:

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
my $wert = shift (@_) || 0;
my $stellen = shift (@_) || 0;
my $vorzeichen = '';
my $vorkomma = 0;
my $nachkomma = '';
if ($stellen >= 0 && $stellen <= 9 && !($wert =~ /[^+-\.0-9]/)) {
        if (substr ($wert,0,1) eq '-' || substr ($wert,0,1) eq '+') {
                $vorzeichen = '-' if substr ($wert,0,1) eq '-';
                $wert = substr ($wert,1);
        }
        ($vorkomma,$nachkomma) = split /\./,$wert;
        $vorkomma = 0 unless $vorkomma;
        $nachkomma = '' unless $nachkomma;
        if (length ($nachkomma) > $stellen) {
                my $auf = (substr ($nachkomma,$stellen,1) > 4 ? 1 : 0);
                if (!$stellen) {
                        $vorkomma ++ if $auf;
                        $nachkomma = '';
                }
                else {
                        if ($auf) {
                                if (substr ($nachkomma,0,$stellen) eq '9' x $stellen) {
                                        $vorkomma ++;
                                        $nachkomma = '';
                                }
                                else {
                                        my ($count) = $nachkomma =~ m!^(0*)!;
                                        my $vornull = length $count;
                                        $vornull -- if substr ($nachkomma,0,$stellen) eq '0' x $stellen;
                                        my $temp = substr ($nachkomma,0,$stellen) + 1;
                                        $nachkomma = ($vornull ? '0' x $vornull : '') . $temp;
                                }
                        }
                        else {
                                $nachkomma = substr ($nachkomma,0,$stellen);
                        }
                }
        }
}
$vorkomma =~ s/^0+([^0])/$1/;
$nachkomma =~ s/0+$//;
return ("$vorkomma.$nachkomma" / 1 ? $vorzeichen : '') . "$vorkomma" . ($nachkomma ne '' && substr ($nachkomma,0,$stellen) ne '0' x $stellen ? ".$nachkomma" : '');
10 print "Hallo"
20 goto 10

View full thread Kaufmännisch korrekt runden