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

The*_*air 2 regex perl

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

100u     10km     300nm      and so on
Run Code Online (Sandbox Code Playgroud)

这样它们被解释为:

100*10^-6      10*10^3      300*10^-6
Run Code Online (Sandbox Code Playgroud)

我需要比较这个数字(100u 10km等).例如,如果我想比较100u到10u那就没关系,我只是做了以下,这是不正确的,但做的工作:

$distance =~ s/(.*)u/$1/;
if ($distance >= $desired_distance) {
       printf $distance;
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我有这个数字呢?

1.45m 
Run Code Online (Sandbox Code Playgroud)

我想比较一下

1400u
Run Code Online (Sandbox Code Playgroud)

以上事情无济于事.

too*_*lic 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
Run Code Online (Sandbox Code Playgroud)

  • 作为模块作者,我知道该找什么:) (4认同)
  • 我应该意识到"如果没有CPAN模块那么"是一个纯粹假设的情况. (3认同)

zou*_*oul 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";
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

10 = 10 m
10km = 10000 m
10mm = 0.01 m
Run Code Online (Sandbox Code Playgroud)

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


TLP*_*TLP 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;
}
Run Code Online (Sandbox Code Playgroud)