Fehler #56
parse_amount wandelt Zahlen mit 0 am Anfang in Oktalzahlen um
0%
Beschreibung
In den Nummernfeldern kann man auch rechnen, also z.B. 5+5 eingeben, und nach dem Erneuern erscheint 10.
In SL/Form.pm in parse_amount werden hierzu nach der Nummernumformatierung aus der Eingabe alle nicht-mathematischen Zeichen rausgefiltert
$amount =~ /^ [\s \d \( \) \- \+ \* \/ \. ]* $/x;
und das Ergebnis durch eval geschickt. Es bleiben also nur Zahlen und ()+-*/ für eval übrig.
In eval werden aber Zahlen mit führenden Nullen als oktal interpretiert, also eval(010) ergibt 8. eval(010+10) ergibt 16.
Moritz hat im Chat schnell ein paar Regexes vorgeschlagen um führende Nullen am Anfang und direkt nach mathematischen Zeichen rauszufiltern. Hier ein Testskript, wobei der Inhalt von $amount schon dem Stand nach der Umwandlung durch parse_amount entsprechen sollte:
#!/usr/bin/perl use strict; use warnings; my $amount = shift; $amount =~ s{ ^ \s* 0+ }{}x; $amount =~ s{ ([\(\)\*\+\-/]) \s* 0+}{$1}gx; print "$amount\n"; print eval($amount) . "\n";
$ perl parse.pl '05* ( 03+05)' 5* (3+5) 40
$perl parse.pl '+(010*2)' +(10*2) 20
Das Problem mit der oktalen Umwandlung kann auch auftauchen, wenn man Zahlen im falschen Nummernformat eingibt, wie Bernd bemerkt hat: wenn man als Zahlenformat 1.000,0 hat und 0.10 eingibt, so kommt auch 8 raus.
Historie
Von G. Richardson vor mehr als 9 Jahren aktualisiert
- Status wurde von Neu zu Gelöst geändert
Behoben in Commit 53d05e1f8