如何格式化数字向量和字符串向量? (对话 APL)
How can I format a number vector and a string vector? (Dyalog APL)
我学习 APL 才几个星期,但我真的很喜欢它。我尝试编写简单的函数来练习我学到的东西。这个告诉我如果我每个月从 T 的初始资本中提取 W,在接下来的 13 个月里我还剩下多少钱。
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
...
我该怎么做? Thorn 不起作用,因为它只适用于数字。
有点像,
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
从你的问题来看,应该如何调用函数 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
你应该披露(⊃
) 减少后的P: P←⊃-/T(M×W)
或者使用更简单的P←T-M×W
按照 MBaas 在他的回答中所说的格式化数字:'CF12.2'⎕fmt P
或不带小数部分:'CI11'⎕fmt P
如果将月份名称混合 (↑
) 为 12×3 字符矩阵,则更容易将它们连接 (,
) 在左侧:(↑Months),'CI11'⎕fmt P
用点替换空格:'.'@{⍵=' '}
请注意,此处 11 月的结果最终为 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
∇
正如 、⎕FMT
"format by specification" 就是您要查找的内容。我只想补充一点,整个格式可以由 ⎕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
.
的整数格式
Try it online!
(为了良好的实践,我已经使用 ;M;Months;P
自由地本地化您的变量)
⎕FMT
的完整文档是 available here
请注意 ⎕FMT
可以处理嵌套数组,因此您实际上不必像 那样在缩减后披露,但他的建议通常适用。
我学习 APL 才几个星期,但我真的很喜欢它。我尝试编写简单的函数来练习我学到的东西。这个告诉我如果我每个月从 T 的初始资本中提取 W,在接下来的 13 个月里我还剩下多少钱。
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
...
我该怎么做? Thorn 不起作用,因为它只适用于数字。
有点像,
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
从你的问题来看,应该如何调用函数 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
你应该披露(⊃
) 减少后的P: P←⊃-/T(M×W)
或者使用更简单的P←T-M×W
按照 MBaas 在他的回答中所说的格式化数字:'CF12.2'⎕fmt P
或不带小数部分:'CI11'⎕fmt P
如果将月份名称混合 (↑
) 为 12×3 字符矩阵,则更容易将它们连接 (,
) 在左侧:(↑Months),'CI11'⎕fmt P
用点替换空格:'.'@{⍵=' '}
请注意,此处 11 月的结果最终为 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
∇
正如 ⎕FMT
"format by specification" 就是您要查找的内容。我只想补充一点,整个格式可以由 ⎕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
.
Try it online!
(为了良好的实践,我已经使用 ;M;Months;P
自由地本地化您的变量)
⎕FMT
的完整文档是 available here
请注意 ⎕FMT
可以处理嵌套数组,因此您实际上不必像