Как я могу отформатировать вектор числа и вектор строки? (Дьялог АПЛ)
Я изучал APL всего несколько недель, но мне это очень нравится. Я пытался написать простые функции, чтобы практиковать то, что я изучаю. Это говорит мне, сколько денег у меня останется на следующие 13 месяцев, если я буду снимать W каждый месяц из начального капитала T.
R←T Money W
M←1 2 3 4 5 6 7 8 9 10 11 12 13
Months←'Nov' 'Dec' 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov'
P←-/T(M×W)
R←Months,P
Это дает два правильных числа, но я не мог отформатировать их как
Nov....100,000
Dec.....97,000
Jan.....92,000
...
Как я могу это сделать? Торн не работает, потому что он работает только с числами.
Что-то вроде,
R←13 2 ⍴ Months,P
тоже не работает:
Nov Dec
Jan Feb
Mar Apr
May Jun
Jul Aug
Sep Oct
Nov 97000 94000 91000 88000 85000 82000 79000 76000 73000 70000 67000 64000 61000
Nov Dec
Jan Feb
Mar Apr
May Jun
Jul Aug
Sep Oct
3 ответа
Вы должны раскрыть (⊃
) P после сокращения: P←⊃-/T(M×W)
или используйте более простой P←T-M×W
Отформатируйте числа, как MBaas сказал в своем ответе: 'CF12.2'⎕fmt P
или без дробной части: 'CI11'⎕fmt P
Если вы смешиваете (↑
) названия месяцев в виде матрицы символов размером 12 на 3, их легче катать (,
) их слева: (↑Months),'CI11'⎕fmt P
Чтобы заменить пробелы точками: '.'@{⍵=' '}
Обратите внимание, что результат за ноябрь здесь составил 97000, а не 100000, но это должно быть легко исправить.
∇R←T Money W
M←1 2 3 4 5 6 7 8 9 10 11 12 13
Months←'Nov' 'Dec' 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov'
P←T-M×W
R←(↑Months),'.'@{' '=⍵}'CI11'⎕fmt P
∇
Из ваших вопросов не совсем очевидно, как работает функция Money
должен быть назван, так что я оставлю это. Я думаю, что большая ошибка, которую вы сделали,
R←13 2 ⍴ Months,P
потому что, как вы, как это создали что-то неожиданное.
В основном вам придется индексировать Months
с нет соответствующего месяца, так что Months[someIndex]
имеет ту же форму, что и результат ваших расчетов P
, Как простое решение было бы сделать Months[someIndex],[1.5]P
который склеивает два вместе, но будет как ось (столбцы). Это может быть использовано для дальнейшей обработки, то есть форматирования чисел.
Лично я редко пользуюсь ⍕
для форматирования чисел, но используйте ⎕FMT
вместо этого, как будто дает вам больше контроля над желаемым форматом.
Пример использования:
'CF12.2'⎕fmt 1000×⍳12
1,000.00
2,000.00
3,000.00
4,000.00
5,000.00
6,000.00
7,000.00
8,000.00
9,000.00
10,000.00
11,000.00
12,000.00
Как MBaas ответил, ⎕FMT
"Формат по спецификации" - это то, что вы ищете. Я просто хочу добавить, что все форматирование может быть обработано одним приложением ⎕FMT
, включая заполнение точками:
R←T Money W
M←1 2 3 4 5 6 7 8 9 10 11 12 13
Months←'Nov' 'Dec' 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov'
P←-/T(M×W)
R←(↑Months),'CR<.>I11'⎕FMT P
Части спецификации формата CR<.>I11
являются следующими:C
вставляет запятые между триадами цифр, начиная с крайней правой цифры целой части результата.R<.>
предварительно устанавливает поле с .
который повторяется по мере необходимости, чтобы заполнить поле.I11
целочисленный формат с общей шириной поля на столбец 11
,
Попробуйте онлайн! (Для хорошей практики я взял на себя свободу локализовать ваши переменные с ;M;Months;P
)
⎕FMT
Полная документация доступна здесь
Обратите внимание, что ⎕FMT
может обрабатывать вложенные массивы, так что на самом деле вам не нужно раскрывать после сокращения, как предлагает ngn, но его совет применим в целом.