2017-04-11 65 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