TCL incr为零填充整数提供了错误的值

时间:2014-10-09 11:20:28

标签: tcl increment

我试图增加一个由零填充的数字,使其成为一个六位数字。但奇怪的是,除了单个数字之外的任何值都会给出错误的值。像

set x 000660
incr x 1

给出结果433.还尝试使用较小的数字,如010,但结果是9.为什么会发生这种情况? 解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

您也可以尝试这种方式。

 proc getIntVal { x } { 
        # Using 'scan' command to get the literal integer value
        set count [ scan $x %d n ]
        if { $count!= 1 } { 
            return -1
        }   
        return $n
    }

proc padZero { x } {
    # Using 'format' to pad with leading zeroes. 
    return [ format "%05d" $x ]
}

set val 00060 
puts "Initial value : $val"

set tmp [ getIntVal $val ]; # 'tmp' will have the value as '60'

incr tmp; 

set val [ padZero $tmp ]; # Padding with zero now

puts "Final value : $val" 

答案 1 :(得分:2)

0开头的数字

000660

是八位字节整数。它相当于十进制432

010(与十进制中的8相同)


要删除零,请尝试以下操作:

proc stripzeros {value} {
    regsub ^0+(.+) $value \\1 retval
    return $retval
}

有关详细信息,请参阅Tcl FAQ: How can I use numbers with leading zeroes?

答案 2 :(得分:1)

俞昊已经解释了八位字节的问题,并且Dinesh添加了一些触发来绕过这个问题。我建议创建一个proc,它将采用零填充整数并返回相同格式的另一个零填充整数,它应该像incr一样工作:

proc incr_pad {val args} {
  # Check if increment is given properly
  if {[llength $args] == 0} {
    set args 1
  } elseif {[llength $args] > 1} {
    return -code error {wrong # args: should be "incr_pad varName ?increment?"}
  }

  # Check for integers
  if {![regexp {^[0-9]+$} $val]} {
    return -code error "expected integer but got \"$val\""
  } elseif {![regexp {^[0-9]+$} $args]} {
    return -code error "expected integer but got \"$args\""
  }

  # Get number of digits
  set d [regexp -all {[0-9]} $val]

  # Trim 0s to the left
  set newval [string trimleft $val 0]

  # Now use incr
  incr newval $args

  # Return back the number formatted with the same zero padding as initially given
  return [format "%0${d}d" $newval]
}

有了......

% incr_pad 000660 1
000661
% incr_pad 2.5 1
expected integer but got "2.5"
% incr_pad 02 1.5
expected integer but got "1.5"
% incr_pad 010 2
012
% incr_pad 1 2 3
wrong # args: should be "incr_pad varName ?increment?"
% incr_pad 00024
00025
% incr_pad 999
1000

当然,您可以将功能名称更改为较短的一个或更合适的功能。