在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
设置为下一个百万值。所以在上面的例子中,因为 maxID
是 123456
,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
您好,我在 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
设置为下一个百万值。所以在上面的例子中,因为 maxID
是 123456
,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