Ich habe eine Zeichenfolge, die einen Dezimalwert enthält, und ich muss diese Zeichenfolge in eine Gleitkommavariable konvertieren. Ein Beispiel für die Zeichenfolge, die ich habe, ist "5.45", und ich möchte ein Gleitkommaäquivalent, damit ich .1 hinzufügen kann. Ich habe im Internet gesucht, aber ich sehe nur, wie man eine Zeichenfolge in eine Ganzzahl konvertiert.
string
perl
floating-point
Anton
quelle
quelle
Antworten:
Sie müssen es überhaupt nicht konvertieren:
quelle
[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;'
Dies ist eine einfache Lösung:
Beispiel 1
Ergebnis
Beispiel 2
Ergebnis
quelle
foreach my $i ('00'..'15')
und musste an einigen Stellen die führenden Nullen entfernen. Dieses0+
Casting zu einer Zahl erreicht auch das.Perl ist eine kontextbasierte Sprache. Es macht seine Arbeit nicht gemäß den Daten, die Sie ihm geben. Stattdessen wird anhand der von Ihnen verwendeten Operatoren und des Kontexts, in dem Sie sie verwenden, herausgefunden, wie die Daten behandelt werden. Wenn Sie Zahlen machen, erhalten Sie Zahlen:
Wenn Sie Strings machen, erhalten Sie Strings:
Perl findet meistens heraus, was zu tun ist und es ist meistens richtig. Eine andere Art, dasselbe zu sagen, ist, dass Perl sich mehr um die Verben kümmert als um die Substantive.
Versuchen Sie etwas zu tun und es funktioniert nicht?
quelle
x
ist der String-Replikationsoperator.my $string = ( 45/2 ) x 3; # "22.522.522.5"
mit 45 statt 44 sein? Sonst verstehe ich nicht, woher die .5 im Ergebnis kommen ...Google hat mich hierher geführt, während ich nach der gleichen Frage gesucht habe, die Phill gestellt hat (Sortier-Floats), also dachte ich, es würde sich lohnen, die Antwort zu veröffentlichen, obwohl der Thread etwas alt ist. Ich bin neu in Perl und habe immer noch meinen Kopf darum gewickelt, aber Brian D Foys Aussage "Perl kümmert sich mehr um die Verben als um die Substantive." oben trifft wirklich den Nagel auf den Kopf. Sie müssen die Zeichenfolgen nicht in Floats konvertieren, bevor Sie die Sortierung anwenden. Sie müssen der Sortierung mitteilen, dass die Werte als Zahlen und nicht als Zeichenfolgen sortiert werden sollen. dh
Weitere Informationen zum Sortieren finden Sie unter http://perldoc.perl.org/functions/sort.html
quelle
Soweit ich weiß, ist int () nicht als 'cast'-Funktion zur Bezeichnung des Datentyps gedacht, sondern wird hier einfach (ab) verwendet, um den Kontext als arithmetisch zu definieren. Ich habe (ab) in der Vergangenheit (0 + $ val) verwendet, um sicherzustellen, dass $ val als Zahl behandelt wird.
quelle
int()
wird "(ab) verwendet"; Ich habs.wahrscheinlich was du willst. Seien Sie jedoch gewarnt, wenn $ var is string nicht in numerisch konvertiert werden konnte, wird der Fehler angezeigt und $ var wird auf 0 zurückgesetzt :
Protokolle
quelle
Perl hat wirklich nur drei Typen: Skalare, Arrays und Hashes. Und selbst diese Unterscheidung ist fraglich. ;) Wie jede Variable behandelt wird, hängt davon ab, was Sie damit machen:
quelle
Bei Vergleichen macht es einen Unterschied, ob ein Skalar eine Zahl einer Zeichenfolge ist. Und es ist nicht immer entscheidbar. Ich kann einen Fall melden, in dem Perl einen Float in "wissenschaftlicher" Notation abgerufen und diesen ein paar Zeilen weiter unten in einem Vergleich verwendet hat:
Und hier
$val
wurde nicht als numerisch interpretiert, zB von"2e-77"
abgerufen$line
. Das Hinzufügen von 0 (oder 0,0 für gute alte C-Programmierer) hat geholfen.quelle
Perl ist schwach typisiert und kontextbasiert. Viele Skalare können abhängig von den verwendeten Operatoren sowohl als Zeichenfolgen als auch als Zahlen behandelt werden.
$a = 7*6; $b = 7x6; print "$a $b\n";
Du verstehst
42 777777
.Es gibt jedoch einen subtilen Unterschied. Wenn Sie numerische Daten aus einer Textdatei in eine Datenstruktur einlesen und dann mit anzeigen
Data::Dumper
, werden Sie feststellen, dass Ihre Zahlen in Anführungszeichen stehen. Perl behandelt sie intern als Zeichenfolgen.Lesen Sie :
$my_hash{$1} = $2 if /(.+)=(.+)\n/;
.Dump:
'foo' => '42'
Wenn Sie nicht zitierte Zahlen im Speicherauszug haben möchten:
Lesen Sie :
$my_hash{$1} = $2+0 if /(.+)=(.+)\n/;
.Dump:
'foo' => 42
Nachdem
$2+0
Perl bemerkt hat, dass Sie $ 2 als Zahl behandelt haben, weil Sie einen numerischen Operator verwendet haben.Ich habe dies bemerkt, als ich versucht habe, zwei Hashes mit zu vergleichen
Data::Dumper
.quelle