如何增加一个可能是1或2或3个十进制数字或没有小数值的值?

时间:2014-01-06 13:55:14

标签: regex perl

我必须在文件中增加版本号。我可以模式匹配版本号。在特定字符串中使用以下代码:

if($string =~ /versionName="(\d{1,3}+(\.\d{1,3})?)"/)    

现在有价值的可能性是:
1. x{1,3}.x{1,3}(最多包含三位小数值或不包含小数的值)

现在我必须相应地增加值。

  1. 如果没有小数的值为2,那么我必须使它成为3.
  2. 如果它是一个十进制值为3.2的值,那么我必须将它设为3.3到3.9,之后它应该增加为4.0
  3. 如果它是一个有两个十进制值的值,例如4.22,那么我必须将它设为4.23到4.99,之后它应该增加为5.00
  4. 如果它是一个具有三个十进制值的值,例如56.554,那么我必须将其设为56.555直到56.999,之后它应该增加为57.000
  5. 如果对这个问题有任何疑惑,请告诉我 我之前没有做过这种事情,现在很困惑。 任何帮助将不胜感激。!!

3 个答案:

答案 0 :(得分:3)

基本上,你想忽略“。”在做加法时。

你可以通过乘以10 n 来实现这一点,其中 n 是加法前的小数位数,然后除以相同的因子,但是你' d需要担心浮点精度误差。

你也可以通过字面删除“。”来实现这一点。来自字符串。

if (my ($unit, $frac) = $num =~ /^([^.]*)\.(.+)/s) {
    my $places = length($frac);
    $num = "$unit$frac" + 1;
    $num = sprintf('%0*d', $places+1, $num);  # Handle 0.x
    substr($num, -$places, 0, '.');
} else {
    ++$num;
}

答案 1 :(得分:1)

计算十进制数(1,2,3)= C.乘以10 exp C.加1然后除以10expC。 是的?

示例:

10.999

°乘以1000 = 10999

°add 1 = 11000

°除以1000 = 11.000

答案 2 :(得分:0)

如果版本包含多于一次的小数,那么我们可能会遇到一些问题(例如: - 10.9.9会导致11.0.0)

我试过写一个应该帮助的perl片段

my $version="10 .9.9" ;
$version =~ s/\s+//g ;
my @ver_seg = split("",$version);
my $flag_incr=1;
for (my $i= @ver_seg-1; $i>0 && $flag_incr!=0 ; $i-- )
{
  if ( $ver_seg[$i] !~ /\./ )
  {
    my $temp=$ver_seg[$i];
    $temp=$temp+$flag_incr ;
    $flag_incr= $temp/10;
    $ver_seg[$i]=$temp%10;
  }
}

my $version_new=join("",@ver_seg);
print "hi $version_new \n";

以10.9.9为例。