parsing - Обработка чисел с ведущими нулями в Tcl




integer octal (5)

У меня возникают проблемы с Tcl, используя числа с ведущими нулями. Я разбираю некоторые числа, которые могут иметь начальные нули, такие как «0012», которые следует интерпретировать как целое число «двенадцать».

$ 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?

С другой стороны, что будет представлять собой действительное восьмеричное число в Tcl, если «08» является недопустимым?


Вы захотите прочитать Tcl и Octal Numbers в вики Tcl. Канонический способ - обработать ваш ввод как строку и использовать команду 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
}

Лично я всегда использовал:

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

для дезинфекции $troublesome_number s.


Это самое чистое решение:

% 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

scan : Вероятно, это то, о чем вы заботитесь. Преобразует "09" (даже как строку) в десятичное число 9 .

Заметка:
1. Если это значение не может быть преобразовано в десятичное значение, тогда scan вернет пустую строку ( {} ).
2. Если для команды scan задано имя переменной (например, number переменная в приведенном выше примере), то возвращаемое значение указывает состояние , 0 : не удалось разобрать десятичное число и 1 : успех.

expr : Используется здесь, чтобы продемонстрировать, что expr интерпретирует значение как число и решает исходный вопрос. Он вычисляет выражение (например, expr {2*3} возвращает 6 ).


Эта ссылка должна помочь вам

Действительные восьмеричные числа могут содержать только цифры 0-7 и должны начинаться с 0


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




octal