4

我想知道是否有办法将数字转换为

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。所以我只是删除u然后将它与一个数字进行比较。

但是,如果我有号码怎么办

1.45m 

我想将它与

1400u

上面的东西没有用。

4

3 回答 3

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
于 2013-01-17T13:58:07.347 回答
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

加上测试和错误处理。有关一些更惯用的表达方式,请参阅 TLP 的答案。

于 2013-01-17T13:57:31.197 回答
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;
}
于 2013-01-17T14:00:00.997 回答