在TCL中以字符串形式递增整数值

Incrementing integer value in form of string in TCL

您好,我在 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,return maxID 值应该是 1000000 因为 123456 的下一个百万值是 1000000

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

无论如何,我想知道是否有更简单的方法来做同样的事情。

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

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}]

但这取决于输入值已经是序列中格式正确的成员;这可能完全是个坏主意。

不要使用字符串操作来进行数学运算。对于小于 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