Projekt

Allgemein

Profil

Fehler #56

parse_amount wandelt Zahlen mit 0 am Anfang in Oktalzahlen um

Von G. Richardson vor mehr als 9 Jahren hinzugefügt. Vor mehr als 9 Jahren aktualisiert.

Status:
Gelöst
Priorität:
Normal
Zugewiesen an:
-
Zielversion:
-
Beginn:
13.05.2015
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:

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

#1

Von G. Richardson vor mehr als 9 Jahren aktualisiert

  • Status wurde von Neu zu Gelöst geändert

Behoben in Commit 53d05e1f8

Auch abrufbar als: Atom PDF