在TCL

时间:2017-04-11 14:51:05

标签: string tcl increment string-concatenation

嗨我在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...]命令。

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

2 个答案:

答案 0 :(得分: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}]

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

答案 1 :(得分:0)

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

您要做的是将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