如何将字符串数转换为实数?

时间:2013-01-17 13:49:34

标签: regex perl

我想知道是否有办法转换像

这样的数字
100u     10km     300nm      and so on

以便将它们解释为:

100*10^-6      10*10^3      300*10^-6

我需要比较这些数字(100u 10km等)。例如,如果我想将100u与10u进行比较,那么我只需执行以下操作,这是不正确的但是可以完成工作:

$distance =~ s/(.*)u/$1/;
if ($distance >= $desired_distance) {
       printf $distance;
}

其中(。*)u是数字,例如100u。所以我只删除“你”,然后将其与数字进行比较。

但如果我有号码

那该怎么办?
1.45m 

我希望将它与

进行比较
1400u

以上事情无济于事。

3 个答案:

答案 0 :(得分:12)

Number::FormatEng有助于将标准前缀转换为数值:

use warnings;
use strict;

use Number::FormatEng qw(:all);
for (qw(100u 1.45m 1400u)) {
    print "$_ ", unformat_pref($_), "\n";
}

__END__

100u 0.0001
1.45m 0.00145
1400u 0.0014

答案 1 :(得分:7)

如果没有CPAN模块,您可以随时自行推送:

my %units = (
    m  => 1,
    km => 1000,
    mm => 0.001,
);

for my $num (qw(10 10km 10mm)) {
    $num =~ /(\d+)(\w+)?/;
    my $value = $1;
    my $unit  = $2 || 'm';
    print "$num = ", $value*$units{$unit}, " m\n";
}

哪个输出:

10 = 10 m
10km = 10000 m
10mm = 0.01 m

Plus测试和错误处理。请参阅TLP的答案,了解更多惯用语。

答案 2 :(得分:6)

只需制作一个子程序来规范输入,例如

sub normalize {
    my %unit = (
        u  => 10^-6,
        km => 10^3,
        # etc
    );
    my $num = shift;
    my ($base, $unit) = $num =~ /(\d+)(\S+)/;
    $base *= $unit{$unit} // 1;   # default to 1 if no unit is found
    return $base;
}