我试图增加一个由零填充的数字,使其成为一个六位数字。但奇怪的是,除了单个数字之外的任何值都会给出错误的值。像
set x 000660
incr x 1
给出结果433.还尝试使用较小的数字,如010,但结果是9.为什么会发生这种情况? 解决这个问题的正确方法是什么?
答案 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)
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
当然,您可以将功能名称更改为较短的一个或更合适的功能。