如何格式化数字向量和字符串向量? (对话 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

Try it online!

你应该披露() 减少后的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
∇

Try it online!

正如 ⎕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 可以处理嵌套数组,因此您实际上不必像 那样在缩减后披露,但他的建议通常适用。