2017-04-11 58 views
0

您好我有一个string变量在tcl中存储一些integer值。我需要从string变量得到最左边的数字,1。增加它基本上下面是我写来完成我的任务代码:以字符串形式在TCL中递增整数值

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...]命令可用。

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

+0

根据您发布的代码,“maxID”的结果值为“1123456”,而不是“2000000”。 – mkrieger1

+0

谢谢,没有意识到maxid值不到一百万。 – Naphstor

+0

所以你基本上想把'maxID'凑到最接近的几百万,对吧? – mkrieger1

回答

0

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

你在做什么似乎是一个错误的方式去做到这一点。更好地利用%运算符在用整数表示时进行整数除法的事实。

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

但是这取决于输入值已经是该序列的结构良好的成员;这可能完全是一个坏主意。

+0

你提到'%'运算符,但不要在你的代码中使用它...我想你的意思是'/'无论如何?而且我也不认为'maxID'如果不到一百万就应该增加1。 – mkrieger1