постоянный ток (1) и ведущие нули - PullRequest
2 голосов
/ 17 марта 2011

У меня есть сценарий оболочки, и я делаю некоторые вычисления с помощью dc (1).

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

Z
Выскакивает значение из стека, вычисляет количество цифр имеет (или количество символов, если это это строка) и толкает это число. Число для номер не содержит ведущих нули , даже если они отображаются на справа от точки ось.

Что подразумевает, что есть простой и прямой способ ...

Я знаю, что существует один и тот же метод для достижения этой цели, и я с удовольствием выполняю сценарий с одним из них. Мне просто любопытно; -)

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Попробуйте:

Введите:

[lc1+dsc0nld>b]sb
[sddZdscld>bp]sa
999
12lax

Выход:

000000999

Введите:

3lax

Выход:

999

Исходный номер остается в стеке после окончания макроса. Используемые регистры: a (макрос), b (макрос), c (количество), d (цифры).

Пояснение:

Macro a выполняет настройку, вызывает b и печатает оригинальный номер.

  • sd - сохранить количество цифр для вывода в регистр d
  • dZ - продублируйте оригинальное число и введите количество цифр
  • dsc - продублируйте это количество и сохраните его в регистре c
  • ld>b - загрузить нужные цифры из регистра d, если он больше, чем счетчик, вызвать макрос b
  • p - печать оригинального номера

Макрос b выводит нули до тех пор, пока число не станет больше числа желаемых цифр

  • lc1+ - загрузить счет из регистра c и увеличить его
  • dsc - продублируйте счет и сохраните его для регистрации c
  • 0n - вывести ноль без перевода строки
  • ld>b - загрузить нужные цифры из регистра d, если он все еще больше, чем увеличенный счетчик, затем вернуться к циклу, чтобы снова запустить макрос b, в противном случае он вернется к вызывающей стороне (макрос a)

Чтобы использовать произвольный ведущий символ:

[lclkZ+dsclknld>b]sb
[sksddZdscld>bp]sa
999 14 [ ] lax
           999
[abc] 12 [-] lax
---------abc

В дополнение к другим регистрам он использует k для хранения символа (который на самом деле может быть больше одного):

[XYZ] 6 [def] lax
defXYZ
8 [ab] lax
abababXYZ
4 [ghjikl] lax
ghijklXYZ

Строки заполнения используются целыми, поэтому результат может быть длиннее, чем вы просили, если желаемый номер длины больше, чем длина исходной строки, но меньше, чем длина двух строк (или целых кратных).

0 голосов
/ 17 марта 2011

Вот пример, хотя и не элегантный.Это печатает 999 с 2 ведущими нулями.Вам нужно будет продублировать код для большего количества цифр.

#Push number to print on stack
999

# macro to print a zero
[[0]P]sa

# Print a zero if less than 5 digits
dZ5>a

# Print a zero if less than 4 digits
dZ4>a

# Print a zero if less than 3 digits
dZ3>a

# Print a zero if less than 2 digits
dZ2>a

# Print out number
p
...