如何在 APL 中根据秒数创建时间字符串?
How do I create a time string from a number of seconds in APL?
我想将自午夜以来的秒数转换为 HH:MM:SS 格式的字符串。
例如,数字17672
应该变成字符串'04:54:32'
。我可以通过数学计算得到整数分量,如下所示:
T←17672
H←⌊T÷3600
MS←3600|T
M←⌊MS÷60
S←60|T
H M S
4 54 32
但我不知道如何将这个数组的三个组成部分连接成一个字符串(以冒号分隔),和在每个时间组成部分左边填充一个零。例如,我想要
6 0 8
成为 '06:00:08'
.
我可以使用 GNU APL 或在线 ngn-apl
第一步是使用“encode”函数改进计算:
24 60 60⊤17672
4 54 32
为了格式化这些数字并插入冒号,我通常使用 ⎕FMT
这是一个特定于供应商的函数,用于将数字格式化为字符串。在大多数 APL 中执行此操作的一般方法可能是这样的:
a←,⍕3 1⍴24 60 60⊤17672
1↓,':',3 2⍴('0',a)[1+(⍳⍴a)×a≠' ']
04:54:32
最后,您可以将其放入函数中,而不是在会话中执行:
R←FormatSecs secs;a
a←,⍕3 1⍴60 60 60⊤secs
R←1↓,':',3 2⍴('0',a)[1+(⍳⍴a)×a≠' ']
我们来测试一下:
FormatSecs 17672
04:54:32
任务完成;-)
在扩展 APL(所有现代 APL)中,您可以使用
1↓∊':',¨¯2↑¨⍕¨100+24 60 60⊤T
ngn/apl 有一个不合格的 ⍕
所以你需要
1↓∊':',¨¯2↑¨,¨⍕¨100+24 60 60⊤T
在 Dyalog、GNU 和 ngn/apl 中,您可以通过将其括在大括号中来生成 dfn (lambda)。试试看 in ngn/apl and in Dyalog APL.
使用 Dyalog APL 16.0 或更高版本,您可以使用 @
运算符放置冒号:
{1↓':'@4 7∊⍕¨100+24 60 60⊤⍵}
我想将自午夜以来的秒数转换为 HH:MM:SS 格式的字符串。
例如,数字17672
应该变成字符串'04:54:32'
。我可以通过数学计算得到整数分量,如下所示:
T←17672
H←⌊T÷3600
MS←3600|T
M←⌊MS÷60
S←60|T
H M S
4 54 32
但我不知道如何将这个数组的三个组成部分连接成一个字符串(以冒号分隔),和在每个时间组成部分左边填充一个零。例如,我想要
6 0 8
成为 '06:00:08'
.
我可以使用 GNU APL 或在线 ngn-apl
第一步是使用“encode”函数改进计算:
24 60 60⊤17672
4 54 32
为了格式化这些数字并插入冒号,我通常使用 ⎕FMT
这是一个特定于供应商的函数,用于将数字格式化为字符串。在大多数 APL 中执行此操作的一般方法可能是这样的:
a←,⍕3 1⍴24 60 60⊤17672
1↓,':',3 2⍴('0',a)[1+(⍳⍴a)×a≠' ']
04:54:32
最后,您可以将其放入函数中,而不是在会话中执行:
R←FormatSecs secs;a
a←,⍕3 1⍴60 60 60⊤secs
R←1↓,':',3 2⍴('0',a)[1+(⍳⍴a)×a≠' ']
我们来测试一下:
FormatSecs 17672
04:54:32
任务完成;-)
在扩展 APL(所有现代 APL)中,您可以使用
1↓∊':',¨¯2↑¨⍕¨100+24 60 60⊤T
ngn/apl 有一个不合格的 ⍕
所以你需要
1↓∊':',¨¯2↑¨,¨⍕¨100+24 60 60⊤T
在 Dyalog、GNU 和 ngn/apl 中,您可以通过将其括在大括号中来生成 dfn (lambda)。试试看 in ngn/apl and in Dyalog APL.
使用 Dyalog APL 16.0 或更高版本,您可以使用 @
运算符放置冒号:
{1↓':'@4 7∊⍕¨100+24 60 60⊤⍵}