我想知道是否有办法转换数字
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)
如果没有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的答案,了解一些更惯用的表达方式.
只需制作一个子程序来规范输入,例如
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)