2017-04-11 9 views
0

안녕하세요, integer 값을 저장하는 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; 

지금 내가 뭘하려고하다 1 백만보다 크거나 같으면 maxID을 다음 백만 값으로 설정하십시오. 위의 예에서 maxID123456이므로 123456의 다음 백만 값은 1000000이므로 이후 maxID 값은 1000000이어야합니다.

이렇게하려면 가장 왼쪽 숫자가 1 인 다음 1 씩 증가시키고 값을 증가시키는 6 개의 0을 연결합니다. 나는 아직 [string cat $args $args...] 명령을 사용할 수 없으므로 tcl 8.5.x를 사용하고 있습니다.

어쨌든, 같은 일을하는 간단한 방법이 있는지 궁금합니다.

+0

게시 한 코드에 따르면 'maxID'의 결과 값은 '2000000'이 아니라 '1123456'이됩니다. – mkrieger1

+0

고마워요, 맥시드 값이 백만 미만이라는 것을 깨닫지 못했습니다. – Naphstor

+0

그래서 기본적으로'maxID'를 백만 분의 가장 가까운 배수로 반올림하고 싶습니다. 맞습니까? – mkrieger1

답변

0

문자열 조작을 사용하여 수학 연산을 수행하지 마십시오. 1000000보다 작은 값의 특별한 경우가 필요하며 9999999 이상의 값 (예 : 10000000)이 11000000 대신 2000000이되면 올바르게 작동하지 않습니다.

maxID을 가장 가까운 백만의 배수로 반올림하는 것입니다. 수학 연산자를 사용하여 특별한 경우를 처리하지 않고도 간단한 코드로이 작업을 수행 할 수 있습니다.

> roundUp 5 6 
6 
> roundUp 6 6 
12 
: 1000000는 다른 단계를 사용

> roundUp 0 
1000000 
> roundUp 123456 
1000000 
> roundUp 999999 
1000000 
> roundUp 1000000 
2000000 
> roundUp 9999999 
10000000 
> roundUp 10000000 
11000000 

: 여기

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

은 몇 가지 예입니다 : 또한, 그 별도의 노력으로 백만 이상의 뭔가의 배수로 반올림 수 있습니다
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