Неисправность HP Basic при печати с использованием

Насколько я понимаю, следующее утверждение:

print using "<0>#,##", 1234

выходы:

1,234

что имеет смысл; начальные нули (которых нет) и пять символов, доступных для пяти символов, которые мы хотим вывести. Другое утверждение, которое я понимаю, это:

print using "<0>#####,#######", "12345678"L

который выводит:

00,012,345,678

опять же, имеет смысл, учитывая мое понимание символов форматирования; Для цифр, запятых и ведущих нулей доступно 14 символов.

Чего я не понимаю, так это как:

print using "<0>####,#######", "12345678"L

может выводить:

00,012,345,678

Конечно, это слишком много ведущих нулей? Обязательно должно быть:

0,012,345,678

Я вижу, что иногда начальный нуль добавляется сверх указанной длины, если в противном случае вывод начинался бы с ведущей запятой, как в этом примере:

print using "<0>###,#######", "12345678"L

который производит

0,012,345,678

несмотря на то, что, казалось бы, недостаточно места. Но является ли предыдущий пример ошибкой в ​​Basic, или я что-то здесь упускаю?


person Community    schedule 25.02.2014    source источник
comment
ОСНОВНЫЕ версии компилятора/RTL? BASIC/LIST=TT: TT:...END...^Z. anal/image/select=ident=image sys$library:dec$basrtl   -  person Hein    schedule 25.02.2014


Ответы (1)


Похоже на баг. Он добавляет бонус к начальному нулю, когда ‹0> и разделитель тысяч играют вместе. Это ‹0> должно считаться за 1 позицию.

У меня воспроизводится на Basic 1.3 (OpenVMS 8.3) и 1.7-000 на OpenVMS 8.4. Я использовал меньшие тестовые значения, чтобы избежать путаницы/взаимодействия с максимальным целочисленным размером «Десять цифр точности для ДЛИННЫХ целых чисел» Basic Ref manual.

Кстати... хорошее использование "nnn"L. Это предвосхищает любое (подразумеваемое) обсуждение конверсии. Я бы переместил запятую в конец или начало последовательности ###, чтобы не подразумевать определенную позицию.

В качестве (но уродливого) обходного пути вы можете использовать FORMAT$ ( val, format-string ). У него та же проблема, но программа получит изменение для настройки результата.

$ cre tmp.bas
 1      OPTION TYPE = EXPLICIT, SIZE = INTEGER LONG, CONSTANT TYPE = INTEGER
        print using "<0>###,", 1234
        print using "<0>###,", 123
        print using "<0>###,", 12
        print using "<0>###", 1234
        print using "<0>###", 123
        print using "<0>###", 12
 Exit
$ bas tmp
$ link tmp
$ run tmp
1,234
00,123
00,012
1234
0123
0012
person Hein    schedule 25.02.2014
comment
Спасибо за подтверждение ошибки! Я также заметил случаи, когда ему не удавалось добавить начальный ноль. Например, ‹0›##########,,1234 дает 000 001 234 (это тот же результат, который вы получите, если добавите еще один # в строку формата). - person ; 25.02.2014