Nachkommastellen

Hallo ,

ich habe folgenden Code:

my($BasketSubTotal) = GetTLE("#BasketSubTotal_Value");
my($mwst) = ($BasketSubTotal * 16/100);
my($mywert) = GetTLE("#wert");
SaveTLE("#wert","$mwst \n");
SetTLE("#wert",$mwst);

Hier wird ein Wert aus dem Template #BasketSubTotal_Value (Variable) gelesen.
Dieser Wert wird mit 16 multipliziert und dann durch 100 geteilt.
Das Ergebnis wird dann in die Variable #wert gespeichert.

Dieser Code funktioniert.
Nun habe ich folgendes Problem:
Es erscheint als Ergebnis: 87.584. Ich möchte dies auf 2 Stellen nach dem Komma beschränken, mit auf- oder abrunden.
Auch sollte aus dem . lieber ein , erstellt werden.

Ich bin noch Newbie und vielleicht kann mir einer da Tips geben. Ich wäre sehr dankbar…

Danke im voraus
Gruß, Frank

$var=„87.584“;

$var=~s/./,/g; #ersetze . mit ,
$var=~m/(.*?,.{2}).*/g; #kürze
$var=$1;

print $var;

Danke, der Code funktioniert :

Wie baue ich es hier ein??
Hier wird ein Wert aus einer Variablen gelesen…
Es klappt so nicht ganz…wo könnte der Fehler stecken??
Danke…
Pet

my($BasketSubTotal) = GetTLE("#BasketSubTotal_Value");
my($mwst) = ($BasketSubTotal * 16/100);
my ($mwst) =~s/./,/g; #ersetze . mit ,
my ($mwst) =~m/(.*?,.{2}).*/g; #kürze
my($mywert) = GetTLE("#wert");
SaveTLE("#wert","$mwst");
SetTLE("#wert",$mwst);
#END

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

my($BasketSubTotal) = GetTLE("#BasketSubTotal\_Value");
my($mwst) = ($BasketSubTotal \* 16/100);
my ($mwst) =~s/\./,/g; #ersetze . mit ,
my ($mwst) =~m/(.\*?,.{2}).\*/g; #kürze
my ($mwst) = $1; #lese suchergebnis aus dem reg. Ausdruck
#wenn in einem reg. Ausdr. Teile geklammert sind, werden diese von links nach rechts den variablen $1, $2 usw. zugewiesen

my($mywert) = GetTLE("#wert");
SaveTLE("#wert","$mwst");
SetTLE("#wert",$mwst);

Hallo,

leider funktioniert das folgende Skript nicht:

my($BasketSubTotal) = GetTLE("#BasketSubTotal_Value");
my($mwst) = ($BasketSubTotal * 16/100);

BUG:my ($mwst) =~s/./,/g; #ersetze . mit ,
BUG:my ($mwst) =~m/(.*?,.{2}).*/g; #kürze
BUG:my ($mwst) = $1; #lese suchergebnis aus dem reg. Ausdruck

#wenn in einem reg. Ausdr. Teile geklammert sind, werden diese
von links nach rechts den variablen $1, $2 usw. zugewiesen

Die Variable $mwst wird in jeder Zeile durch das wiederholte
Aufrufen mit my aufs neue deklariert und somit der alte
Wert aus den Vorzeilen gelöscht!

Davor warnt Perl automatisch, wenn das Skript mit dem
Warnschalter -w und mit use strict aufgerufen wird.
Das bewahrt vor dem Grossteil von Syntaxfehlern und
sollte bei jedem noch so kleinen Skript verwendet werden.

Weiter ist für Warenkörbe normalerweise das Runden und
nicht das Abschneiden von Nachkommastellen gefragt. Der
folgende Code behebt diese Problemchen:

#!/usr/bin/perl -w -- Perl im Warnmodus
use strict; #der strenge Freund

#my($BasketSubTotal) = GetTLE("#BasketSubTotal\_Value");
# Zeile für Testlauf geändert zu
my $BasketSubTotal = 192.54;

my $mwst = ($BasketSubTotal \* 16/100);

# sprintf rundet die Zahl durch die Formatanweisung %.2f
my $mwst\_formatiert = sprintf("%.2f",$mwst);
# Punkt in Dezimalkomma umwandeln
$mwst\_formatiert =~ s/\./,/;
print "$BasketSubTotal mit $mwst Mwst -\> $mwst\_formatiert\n";

Mfg,

-Andreas.

> > my($BasketSubTotal) = GetTLE("#BasketSubTotal\_Value");  
> > my($mwst) = ($BasketSubTotal \* 16/100);
> 
> BUG:my ($mwst) =~s/\./,/g; #ersetze . mit ,  
> BUG:my ($mwst) =~m/(.\*?,.{2}).\*/g; #kürze  
> BUG:my ($mwst) = $1; #lese suchergebnis aus dem reg. Ausdruck  
> 
> > #wenn in einem reg. Ausdr. Teile geklammert sind, werden diese  
> > von links nach rechts den variablen $1, $2 usw. zugewiesen

Die Variable $mwst wird in jeder Zeile durch das wiederholte
Aufrufen mit my aufs neue deklariert und somit der alte
Wert aus den Vorzeilen gelöscht!

schlägtsichdiehandandiestirn

Davor warnt Perl automatisch, wenn das Skript mit dem
Warnschalter -w und mit use strict aufgerufen wird.
Das bewahrt vor dem Grossteil von Syntaxfehlern und
sollte bei jedem noch so kleinen Skript verwendet werden.

Weiter ist für Warenkörbe normalerweise das Runden und
nicht das Abschneiden von Nachkommastellen gefragt. Der
folgende Code behebt diese Problemchen:

> #!/usr/bin/perl -w -- Perl im Warnmodus  
> use strict; #der strenge Freund  
>   
> #my($BasketSubTotal) = GetTLE("#BasketSubTotal\_Value");  
> # Zeile für Testlauf geändert zu  
> my $BasketSubTotal = 192.54;  
>   
> my $mwst = ($BasketSubTotal \* 16/100);  
>   
> # sprintf rundet die Zahl durch die Formatanweisung %.2f  
> my $mwst\_formatiert = sprintf("%.2f",$mwst);  
> # Punkt in Dezimalkomma umwandeln  
> $mwst\_formatiert =~ s/\./,/;  
> print "$BasketSubTotal mit $mwst Mwst -\>  
> $mwst\_formatiert\n";

Das ist natürlich eleganter (und auch korrekter), aber streng genommen gegen die Fragestellung :smile:

holli

Hallo Markus,

Das [Runden] ist natürlich eleganter (und auch korrekter), aber streng genommen gegen die Fragestellung :smile:

Es wurde nach Runden und nicht nach Abschneiden gefragt:

> Ich möchte dies auf 2 Stellen nach dem Komma beschränken, mit auf- oder abrunden.

CU,

-Andreas.

holli

Hallo Ihr beiden,

Danke nochmal für Eure Hilfe. Es funzt :smile:))…

Hier der ganze Code:
#BEGIN
my($BasketSubTotal) = GetTLE("#BasketSubTotal_Value");
my($mwst) = ($BasketSubTotal * 16/100);
my($mywert) = GetTLE("#wert");
my ($mwst_format) = sprintf("%.2f",$mwst);
$mwst_format =~ s/./,/;
SaveTLE("#wert","$mwst_format \n");
SetTLE("#wert",$mwst_format);
#END

Gruß, Pet