Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6432[/thread]

Mit String-Werten rechnen?!



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Gast Gast
 2004-07-26 14:16
#84974 #84974
Hi Leute.

Hab euer Forum entdeckt und wende mich jetzt glei mal mit einem dringenden Problem an euch.
Ich habe zwei Zahlen, allerdings als String. Mit denen muss ich aber rechnen können. Geht das überhaupt? Wie kann ich einen string in einen numerischen Wert umwandeln? Habs schon mit eval probiert. Das hat aber nicht den gewünschten Effekt.

Wert1 = 1350,00
Wert2 = 216,00

Wert1 - Wert2 = xxxxx


Danke schon mal im Vorraus!
Ronnie
 2004-07-26 14:24
#84975 #84975
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Probier es mal so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

my $Wert1 = '1350,70';
my $Wert2 = '216,00';
s/,/\./g for ($Wert1, $Wert2);

my $Wert3 = $Wert1 - $Wert2;

print $Wert3, "\n";

Wichtig ist das ersetzen des ',' durch den '.'! Perl ist eine typenfreie Sprache, d.h. die Konvertierung zwischen Zeichenketten und Zahlen geschieht selbstständig soweit möglich.\n\n

<!--EDIT|Ronnie|1090837705-->
BungeeBug
 2004-07-26 14:25
#84976 #84976
User since
2004-03-16
54 Artikel
BenutzerIn
[default_avatar]
eval(); ist was du suchst :)
MfG
BungeeBug
Ronnie
 2004-07-26 14:36
#84977 #84977
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wenn du alternativ eine Textdatei mit solchen zuweisungen auswerten möchtets, könnte das so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %hash;

while (<DATA>) {
s/,/\./g;
$hash{$1} = $2 if m/^(\w+)\s=\s(.*)$/;
}

print $hash{Wert1} - $hash{Wert2}, "\n";
print Dumper \%hash;
exit;

_ _DATA_ _
Wert1 = 1350,00
Wert2 = 216,00
[E|B]
 2004-07-26 15:01
#84978 #84978
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@Ronnie

Wieso so kompliziert? :)

Code: (dl )
1
2
3
4
5
6
7
8
C:\>perl
$string1 = "20";
$string2 = "30";

print eval($string1+$string2);
^D
50
C:\>
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Dubu
 2004-07-26 15:05
#84979 #84979
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@[E|B]: Wozu das eval?
format_c
 2004-07-26 15:05
#84980 #84980
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@[E|B]: Ok kompliziert ist das letzte Beispiel schon etwas. Aber du musst dein Script auch noch etwas "komplizierter" machen wenn es so etwas können soll:
Code: (dl )
1
2
3
4
5
6
7
C:\Dokumente und Einstellungen\format_c>perl
my $wert1 = "50,1";
my $wert2 = "60,5";
print eval $wert1 + $wert2;
_ _END_ _
110
C:\Dokumente und Einstellungen\format_c>
[E|B]
 2004-07-26 15:23
#84981 #84981
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=Dubu,26.07.2004, 13:05]@[E|B]: Wozu das eval?[/quote]
Falls es eine Situation wie in format_c's Post geben sollte.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Crian
 2004-07-26 15:33
#84982 #84982
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Perl unterscheidet nicht zwischen Zahlen und Stringvariablen (ok, intern natürlich schon, aber Du musst Dich darum nicht kümmern).

Z.B. setzt der Punkt Strings zusammen. Hinterher kann man mit dem zusammengesetzten dann aber auch einfach rechnen, etwa:

Code: (dl )
1
2
3
my $x = '15' . '16';
my $y = $x / 2;
print $y;


Gibt 758 aus.

Einziges Problem sind ev. Deine deutschen Kommas als Dezimaltrenner.

Dies könntest Du mit $variable ~= y/,/./ beheben.

Ach ja: Und herzlich willkommen im Forum :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2004-07-26 15:37
#84983 #84983
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aber wie Ronnie schon in seiner ersten Antwort geschrieben hat, muss das ',' duch '.' ersetzt werden, da sonst nur die Zahlen vor dem ',' berücksichtig werden (siehe format_c's Code)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2004-07-26 14:16.