在 Tcl 中处理带前导零的数字
我在 Tcl 中使用带前导零的数字时遇到问题。我正在解析一些可能有前导零的数字,例如“0012”,它应该被解释为整数“12”。
$ tclsh
% set a 8
8
% set b 08
08
% expr $a - 1
7
% expr $b - 1
expected integer but got "08" (looks like invalid octal number)
处理 Tcl 中可能有前导零的数字的最佳方法是什么?
顺便说一句,如果“08”是无效的,那么在 Tcl 中什么构成有效的八进制数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(7)
这是最干净的解决方案:
% expr [ scan "08" %d ] - 1
7
此外:
% expr [ scan "09" %d ]
9
% expr [ scan 09 %d ]
9
% set nine 09
09
% expr [ scan $nine %d ]
9
% set success [ scan $nine %d number ]
1
% puts $number
9
扫描:这可能是您关心的。转换“09”
(即使作为字符串)转换为十进制数 9
。
注意:
1. 如果该值无法转换为十进制值,则scan
将返回空字符串 ({}
)。
2. 如果为scan
命令提供变量名称(如上例中的number
变量),则返回值指示状态 ,0
:解析十进制失败,1
:成功。
expr :此处用于演示 expr
将值解释为数字,并解决原始问题。它计算一个表达式(例如 expr {2*3}
返回 6
)。
我的所有这些 Tcl/Tk 8.1 版程序都已损坏,因为 Tcl/Tk 8.5.10 无法正确处理字符串/数字转换。
在这里,shell 进入 Tcl,然后输入:(
% expr {01}
1
等等..)
% expr {06}
6
% expr {07}
7
,然后我们得到 8...
% expr {08}
missing operator at "_@_"
看起来像无效的八进制数
,但情况会变得更糟。仍然在 Tcl shell 中,尝试以下操作:
在我的 Tcl8.1 shell 中:
% format "%.0f" {08}
8
但是在我新的和改进的 Tcl8.5 shell 中,我收到一个错误:
% format "%.0f" {08}
expected floating-point number but got "08" (looks like invalid octal number)
这太愚蠢了!
我的所有代码在 Tcl7.6 和 Tcl8.1 中都可以正常工作,但是开始给出
Tcl8.5 中奇怪的、随机的结果。只有当数字08恰好出现时
生成或使用!我花了几个小时试图找出问题所在。
但事实证明,这只是我正在使用的令人讨厌的代码!
因此,我发布此咆哮作为警告。
Tcl/Tk 版本 8.5.10 错误地处理数字 8。如果你是
期望您的格式语句有正常的行为,这种情况不会发生。
您的代码将继续前进,直到遇到值为 {08} 的字符串,并且
Tcl 8.5.10 解释器将生成错误,因为它会假设
{08} 是一个特殊情况的八进制数,无论所有
您使用过的其他小数字也可以很好地发挥作用!
上述问题的一种可能解决方案是降级回 Tcl 8.1
壳。我已经确认该版本至少可以处理格式
正确表述数字 08。 Tcl 8.5.10 shell 根本就没有。
set $clean_number [regsub {^0*(.+)} $troublesome_number {\1}] this doesnt work
set clean_number ""
set $troublesome_number 08
% set $clean_number [regsub {^0*(.+)} $troublesome_number {\1}]
wrong # args: should be "regsub ?switches? exp string subSpec varName"
一个更简单的解决方案是:
set x 08
regsub {^[0]} $x {\1} x
puts $x
=>8
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
您需要在 Tcl wiki 上阅读Tcl 和八进制数。规范的方法是将您的输入视为字符串并使用
scan
命令来提取数字。这导致了这个,是的,多行过程:You'll want to read Tcl and Octal Numbers at the Tcl wiki. The canonical way is to treat your input as a string and use the
scan
command to extract the numbers. That leads to this, yes multiline, proc: