6

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 で有効な 8 進数を構成するものは何ですか?

4

7 に答える 7

9

Tcl wiki でTcl and Octal Numbersを読んでください。標準的な方法は、入力を文字列として扱い、scanコマンドを使用して数値を抽出することです。これは、はい、複数行、proc につながります。

proc forceInteger { x } {
    set count [scan $x %d%s n rest]
    if { $count <= 0 || ( $count == 2 && ![string is space $rest] ) } {
        return -code error "not an integer: \"$x\""
    }
    return $n
}
于 2010-01-21T18:31:31.317 に答える
2

Tcl/Tk 8.5.10 が文字列/数値変換を正しく処理していないため、壊れたこれらの Tcl/Tk バージョン 8.1 プログラムがすべてあります。

ここで、Tcl にシェルし、次のように入力します。

 %  expr {01}
 1

(等々..)

 %  expr {06}
 6

 %  expr {07}    
 7

そして8に到達...

 %  expr {08}
 missing operator at "_@_"

無効な 8 進数のようです

しかし、それは悪化します。まだTclシェルで、これを試してください:

私の Tcl8.1 シェルでは:

 % format "%.0f" {08}
 8

しかし、新しく改善された Tcl8.5 シェルでは、次のエラーが発生します。

 % 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 インタープリターはエラーを生成しますあなたが使用した他のすべての小さな数字はうまくいきます!

上記の問題の解決策の 1 つは、Tcl 8.1 シェルにダウングレードすることです。そのバージョンが、少なくとも番号 08 のフォーマット ステートメントを正しく処理することを確認しました。Tcl 8.5.10 シェルは単純にそうではありません。

于 2011-10-15T07:41:15.347 に答える
2
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
于 2010-12-17T16:25:46.367 に答える
1

このリンクはあなたを助けるはずです

有効な8進数には、0〜7の数字のみを含めることができ、0で始まる必要があります

于 2010-01-21T16:30:27.537 に答える
1

個人的に私はいつも使ってきました:

set $clean_number [regsub {^0*(.+)} $troublesome_number {\1}]

sを消毒し$troublesome_numberます。

于 2010-01-21T16:45:48.243 に答える