【问题标题】:Incrementing integer value in form of string in TCL在TCL中以字符串形式递增整数值
【发布时间】:2017-04-11 14:51:04
【问题描述】:

嗨,我在 tcl 中有一个 string 变量,它存储了一些 integer 值。我需要从 string 变量中获取最左边的数字并将其递增 1。基本上下面是我为完成任务而编写的代码:

set maxID 123456;
if {$maxID < 1000000} {
  set maxID 1000000;
} elseif {$maxID >= 1000000} {
  set maxID [expr [string index $maxID 0] + 1]000000; #Need to Simplify this
}
return $maxID;

现在我要做的是,如果 maxID 大于或等于 100 万,请将 maxID 设置为下一个百万值。所以在上面的例子中,因为maxID123456,所以返回maxID 值应该是1000000,因为123456 的下一个百万值是1000000

为此,我得到最左边的数字 1,然后将其增加 1 并连接六个零,这将增加值。我正在使用 tcl 8.5.x,所以我仍然没有可用的 [string cat $args $args...] 命令。

无论如何,我想知道是否有更简单的方法可以做到这一点。

【问题讨论】:

  • 根据您发布的代码,maxID 的结果值将是 1123456,而不是 2000000
  • 谢谢,没有意识到最大值小于一百万。
  • 所以你基本上想将maxID 舍入到最接近的一百万倍数,对吧?
  • 是的,没错。

标签: string tcl increment string-concatenation


【解决方案1】:

不要使用字符串操作来进行数学运算。对于小于 1000000 的值,它需要特殊情况,而对于大于 9999999 的值,它不能正常工作(例如,10000000 导致 2000000 而不是 11000000)。

您要做的是将maxID 舍入到最接近的一百万倍数。您可以在非常简单的代码中执行此操作,而无需使用数学运算符进行特殊情况处理。此外,这允许在不付出额外努力的情况下四舍五入到百万以外的倍数:

proc roundUp {value {step 1000000}} {
    expr {($value / $step + 1) * $step}
}

这里有一些例子:

> roundUp 0
1000000
> roundUp 123456
1000000
> roundUp 999999
1000000
> roundUp 1000000
2000000
> roundUp 9999999
10000000
> roundUp 10000000
11000000

使用与1000000不同的步骤:

> roundUp 5 6
6
> roundUp 6 6
12

【讨论】:

    【解决方案2】:

    您正在做的事情似乎是一种错误的方式。更好地利用 % 运算符在呈现整数时进行整数除法这一事实。

    if {$maxID >= 1000000} {
        set bigbits [expr {$maxID / 1000000}]
        incr bigbits
        set maxID [expr {$bigbits * 1000000}]
        # Converting the three lines above into one is left as an exercise ;-)
    } else {
        incr maxID
    }
    

    在最简单的情况下,你也许可以摆脱这个:

    if {$maxID >= 1000000} {
        incr maxID 1000000
    } else {
        incr maxID
    }
    
    # Or:  incr maxID [expr {$maxID >= 1000000 ? 1000000 : 1}]
    

    但这取决于输入值已经是序列的格式良好的成员;这可能是个坏主意。

    【讨论】:

    • 您提到了% 运算符,但不要在您的示例代码中使用它...我猜您的意思是/ 无论如何?而且我不认为maxID 如果小于一百万,就应该增加 1。
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多