【问题标题】:How to increment a value which could be of either 1 or 2 or 3 decimal digits or without decimal values also?如何增加一个可以是 1 位或 2 位或 3 位十进制数字或没有十进制值的值?
【发布时间】:2014-01-11 22:13:58
【问题描述】:

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

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

如果对问题有任何混淆,请告诉我。
我以前没有做过这种事情,现在很困惑。 任何帮助将不胜感激。!!

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    基本上,您想忽略“。”加法时。

    您可以通过乘以 10n 来实现,其中 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;
    }
    

    【讨论】:

    • 您好,谢谢。代码工作正常。但我不是编程背景。你能帮我知道它是如何工作的吗?
    • 删除“.”从字符串。加一。重新插入“。”在字符串中。
    • 谢谢,打印数值和理解函数后得到!!
    【解决方案2】:

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

    例子:

    10.999

    ° 乘以 1000 = 10999

    ° 加 1 = 11000

    ° 除以 1000 = 11.000

    【讨论】:

    • 这可能会从 1.19 到 1.20 再到 1.30 中断。换句话说,将 .01 添加到 1.19 可能会产生 1.2,而不是正则表达式匹配的 1.20。
    • 这就是为什么我写了 11.000 作为之前的结果。它应该保留正确的小数部分。
    • 会吗? perl -e 'print ((10.999 * 1000 + 1)/1000)' 只为我生成 11。
    • @Arkadiy,您需要以 (s)printf 结尾来格式化数字。
    • 您可以在答案中添加 sprintf 吗?
    【解决方案3】:

    如果版本包含多个十进制,那么我们可能会遇到一些问题(例如:- 10.9.9 应该导致 11.0.0)

    我试图写一个 perl sn-p 应该会有所帮助

    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 为例。

    【讨论】:

    • 感谢您的关注,就我而言,它只会像我提到的那样。仅表示类似于 10.99 但绝不表示 10.9.9
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多