gpt4 book ai didi

common-lisp - 在 Common Lisp 中将数字格式化为特定格式

转载 作者:行者123 更新时间:2023-12-02 05:58:44 25 4
gpt4 key购买 nike

我想将整数(毫秒)转换为以下格式:

HH:MM:SS,SSS

例如时间戳 12,5 秒是 00:00:12,500和 1 小时 38 分 10 秒一样 01:38:10,000 .

我是 Lisp 编程的新手,但这是我目前所掌握的。

(defun ms->time (ms)
(let ((hours 0)
(minutes 0)
(seconds ms))
(progn
(and (>= seconds 3600000)
(progn
(setq hours (floor (/ seconds 3600000)))
(setq seconds (mod seconds 3600000))))
(and (>= seconds 60000)
(progn
(setq minutes (floor (/ seconds 60000)))
(setq seconds (mod seconds 60000))))
(format nil "~2,'0d:~2,'0d:~6,'0:d" hours minutes seconds))))

这是简单的输出:

CL> (ms->time 12500)
"00:00:12,500"
CL> (ms->time 5890000)
"01:38:10,000"

看起来不错,正是我想要的。然而……

CL> (ms->time 0)
"00:00:000000"
CL> (ms->time 999)
"00:00:000999"

我该如何解决这个问题? format非常先进,我很确定有一种方法可以做我需要的。当然,如果您对如何将我的函数更改为更lispy 有任何想法,请不要犹豫。我当前的方法看起来与我的 C++ 版本几乎相同。

谢谢!

最佳答案

一个简单的解决方案是将秒分隔成它们自己的组件,例如小时和分钟。我还使用 LET* 隐藏 MS 以避免必须 SETQ 变量:

(defun ms->time (ms)
(let* ((hours (floor ms 3600000))
(ms (mod ms 3600000))
(minutes (floor ms 60000))
(ms (mod ms 60000))
(seconds (floor ms 1000))
(ms (mod ms 1000)))
(format nil "~2,'0d:~2,'0d:~2,'0d,~3,'0d"
hours minutes seconds ms)))

(ms->time 0)
;=> "00:00:00,000"
(ms->time 999)
;=> "00:00:00,999"

我省略了检查是否有足够的毫秒来计算小时或分钟。无论如何,数学都算出来了,我无法想象额外的计算会成为瓶颈。

关于common-lisp - 在 Common Lisp 中将数字格式化为特定格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36897670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com