2017-04-11 20 views
0

こんにちは私はの値を格納するtclにstringという変数を持っています。私は基本的に以下の私は、タスクを達成するために書いたコードがあるstring変数から左端の桁を取得し、1で、それをインクリメントする必要があります:maxIDがある場合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; 

は今、私は何をしようとしていることです100万以上の場合は、maxIDを次の100万の値に設定します。したがって、上記の例ではmaxID123456なので、返信maxIDの値は1000000となります。123456の次の100万の値は1000000です。

これを行うには、1の左端の数字を取得してから1ずつ増やし、値を増やす6つのゼロを連結します。私はtcl 8.5.xを使用していますので、まだ[string cat $args $args...]コマンドが利用できません。

とにかく、同じことを行う簡単な方法があるのだろうと思っていました。

+0

投稿したコードによると、 'maxID'の結果値は' 2000000'ではなく '1123456'になります。 – mkrieger1

+0

ありがとうございました、maxid値が100万未満でした。 – Naphstor

+0

だから、基本的に 'maxID'を100万の最も近い倍数に切り上げたいのですか? – mkrieger1

答えて

0

数学演算を行うために文字列操作を使用しないでください。 1000000より小さい値の特別な場合が必要であり、9999999(たとえば、10000000の結果が11000000の代わりに2000000になる)の値に対して正しく機能しません。

あなたがしたいのは、maxIDを百万の最も近い倍数に切り上げることです。これは、数学演算子を使用して特別なケース処理を必要とせずに、非常に単純なコードで行うことができます。また、それは余分な労力で万人よりも、何か他のものの倍数に切り上げることができます:ここで

proc roundUp {value {step 1000000}} { 
    expr {($value/$step + 1) * $step} 
} 

は、いくつかの例は以下のとおりです。

1000000とは異なるステップを使用して
> roundUp 0 
1000000 
> roundUp 123456 
1000000 
> roundUp 999999 
1000000 
> roundUp 1000000 
2000000 
> roundUp 9999999 
10000000 
> roundUp 10000000 
11000000 

> 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'が100万未満の場合には1だけインクリメントされるとは考えていません。 – mkrieger1

関連する問題