如何格式化数字矢量和字符串矢量? (Dyalog APL)

时间:2018-10-24 20:32:07

标签: formatting apl dyalog

我只学习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     

3 个答案:

答案 0 :(得分:3)

从您的问题来看,如何调用函数Money并不完全清楚,因此我将其省略。 我认为您犯的是 big 错误

R←13 2 ⍴ Months,P

因为您这样做会产生一些意外情况。

基本上,您必须用相应月份的No来索引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

Try it online!

答案 1 :(得分:3)

简化后,您应披露()P:P←⊃-/T(M×W)或使用更简单的P←T-M×W

按照答案中的MBaas格式设置数字:'CF12.2'⎕fmt P或不包含小数部分:'CI11'⎕fmt P

如果您将()月份名称混合为12 x 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
∇

Try it online!

答案 2 :(得分:2)

MBaas has answered一样,⎕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

Try it online! (出于良好的做法,我已自由使用;M;Months;P对变量进行本地化)

⎕FMT的完整文档为available here

请注意,⎕FMT可以处理嵌套数组,因此在归约化后您不必像suggested by ngn那样公开,但是他的建议通常适用。