Saya memiliki string yang memegang nilai desimal di dalamnya dan saya perlu mengubah string itu menjadi variabel floating point. Jadi contoh string yang saya miliki adalah "5.45" dan saya ingin floating point yang setara sehingga saya dapat menambahkan .1 ke dalamnya. Saya telah mencari di sekitar internet, tetapi saya hanya melihat bagaimana mengubah string menjadi integer.
string
perl
floating-point
Anton
sumber
sumber
Jawaban:
Anda tidak perlu mengubahnya sama sekali:
% perl -e 'print "5.45" + 0.1;' 5.55
sumber
[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;'
Ini adalah solusi sederhana:
Contoh 1
my $var1 = "123abc"; print $var1 + 0;
Hasil
123
Contoh 2
my $var2 = "abc123"; print $var2 + 0;
Hasil
0
sumber
foreach my $i ('00'..'15')
dan perlu menghapus angka nol di depan di beberapa tempat. Ini0+
casting ke nomor juga mencapai itu.Perl adalah bahasa berbasis konteks. Itu tidak melakukan tugasnya sesuai dengan data yang Anda berikan. Alih-alih, ia mencari cara untuk memperlakukan data berdasarkan operator yang Anda gunakan dan konteks di mana Anda menggunakannya. Jika Anda melakukan berbagai hal tentang angka, Anda mendapatkan angka:
# numeric addition with strings: my $sum = '5.45' + '0.01'; # 5.46
Jika Anda melakukan hal-hal seperti string, Anda mendapatkan string:
# string replication with numbers: my $string = ( 45/2 ) x 4; # "22.522.522.522.5"
Perl kebanyakan memikirkan apa yang harus dilakukan dan itu sebagian besar benar. Cara lain untuk mengatakan hal yang sama adalah Perl lebih memperhatikan kata kerja daripada kata benda.
Apakah Anda mencoba melakukan sesuatu dan tidak berhasil?
sumber
x
adalah operator replikasi string.my $string = ( 45/2 ) x 3; # "22.522.522.5"
dengan 45 bukannya 44? Kalau tidak, saya tidak mengerti dari mana '.5 berasal dari hasil ...Google membawa saya ke sini saat mencari pertanyaan yang sama yang ditanyakan oleh phill (menyortir float) jadi saya pikir akan bermanfaat untuk memposting jawabannya meskipun utasnya agak lama. Saya baru mengenal perl dan masih memikirkannya, tetapi pernyataan brian d foy "Perl lebih peduli tentang verba daripada kata benda." di atas benar-benar menyentuh paku di kepala. Anda tidak perlu mengubah string menjadi float sebelum menerapkan sortir. Anda perlu memberi tahu pengurutan untuk mengurutkan nilai sebagai angka dan bukan string. yaitu
my @foo = ('1.2', '3.4', '2.1', '4.6'); my @foo_sort = sort {$a <=> $b} @foo;
Lihat http://perldoc.perl.org/functions/sort.html untuk detail lebih lanjut tentang sort
sumber
Seperti yang saya pahami int () tidak dimaksudkan sebagai fungsi 'cast' untuk menunjuk tipe data, itu hanya digunakan (ab) di sini untuk mendefinisikan konteks sebagai satu aritmatika. Saya (ab) menggunakan (0 + $ val) di masa lalu untuk memastikan bahwa $ val diperlakukan sebagai angka.
sumber
int()
sedang "(ab) digunakan"; oke.$var += 0
mungkin apa yang Anda inginkan. Namun berhati-hatilah, jika $ var adalah string tidak dapat dikonversi ke numerik, Anda akan mendapatkan kesalahan, dan $ var akan disetel ulang ke 0 :
my $var = 'abc123'; print "var = $var\n"; $var += 0; print "var = $var\n";
log
var = abc123 Argument "abc123" isn't numeric in addition (+) at test.pl line 7. var = 0
sumber
Perl benar-benar hanya memiliki tiga jenis: skalar, larik, dan hash. Dan bahkan perbedaan itu bisa diperdebatkan. ;) Cara setiap variabel diperlakukan bergantung pada apa yang Anda lakukan dengannya:
% perl -e "print 5.4 . 3.4;" 5.43.4 % perl -e "print '5.4' + '3.4';" 8.8
sumber
Dalam perbandingan, ada bedanya jika skalar adalah sejumlah string. Dan itu tidak selalu bisa diputuskan. Saya dapat melaporkan kasus di mana perl mengambil pelampung dalam notasi "ilmiah" dan menggunakan beberapa baris yang sama di bawah ini sebagai perbandingan:
use strict; .... next unless $line =~ /and your result is:\s*(.*)/; my $val = $1; if ($val < 0.001) { print "this is small\n"; }
Dan di sini
$val
tidak diartikan sebagai numerik untuk misalnya"2e-77"
diambil dari$line
. Menambahkan 0 (atau 0,0 untuk programmer C ole yang baik) membantu.sumber
Perl diketik dengan lemah dan berdasarkan konteks. Banyak skalar dapat diperlakukan sebagai string dan angka, bergantung pada operator yang Anda gunakan.
$a = 7*6; $b = 7x6; print "$a $b\n";
Anda mendapatkan
42 777777
.Namun, ada perbedaan halus. Saat Anda membaca data numerik dari file teks ke dalam struktur data, lalu menampilkannya dengan
Data::Dumper
, Anda akan melihat bahwa nomor Anda dikutip. Perl memperlakukan mereka secara internal sebagai string.Baca:
$my_hash{$1} = $2 if /(.+)=(.+)\n/;
.Membuang:
'foo' => '42'
Jika Anda ingin nomor unquoted di dump:
Baca:
$my_hash{$1} = $2+0 if /(.+)=(.+)\n/;
.Membuang:
'foo' => 42
Setelah
$2+0
Perl memperhatikan bahwa Anda telah memperlakukan $ 2 sebagai angka, karena Anda menggunakan operator numerik.Saya memperhatikan ini saat mencoba membandingkan dua hash dengan
Data::Dumper
.sumber