gimp 方案用前导零格式化结果

问题描述

我正在尝试获取文件名的时间戳。 我使用提供当前时间戳的过程(时间):

(120 11 29 17 32 25)

年-1900 月-1 天时分秒

(+ 1900 (car (time)) )(+ 1 (cadr (time)))(caddr(time))(cadddr(time))(cadr(cdddr(time)))(caddr(cdddr(time)))

这几乎是好的,但是...如果任何元素小于 10(例如,一月一日大约凌晨 1 点:

(121 0 1 1 2 3)

它给出了不正确的时间戳,因为我需要前导零

202111123 应该是 20210101010203

我想知道是否有比检查元素长度并添加“0”更简单的方法

解决方法

Script-Fu 基于 Tiny Scheme,它本身是 R5RS Scheme 的子集。 R5RS Scheme 中没有内置功能来格式化数字或字符串,据我所知,也没有添加到 Script-Fu 中,因此您需要为此创建自己的函数。

使用字符串是最容易的,而且您可能想要字符串来为文件名添加时间戳。

这是一个用零左填充字符串的函数。请注意,结果的长度至少为 Marshal.PtrToStringUni 个字符,但如果输入的 width 已经长于 str,则不会对其进行修剪:

width

您可以在返回所需格式字符串的 (define (left-pad str width pad) (let add-padding ((s str)) (if (< (- width (string-length s)) 1) s (add-padding (string-append pad s))))) 函数中使用此函数:

time-stamp

这里用(define (time-stamp) (let* ((curr (time)) (year (number->string (+ 1900 (list-ref curr 0)))) (month (left-pad (number->string (+ 1 (list-ref curr 1))) 2 "0")) (day (left-pad (number->string (list-ref curr 2)) 2 "0")) (hour (left-pad (number->string (list-ref curr 3)) 2 "0")) (minute (left-pad (number->string (list-ref curr 4)) 2 "0")) (second (left-pad (number->string (list-ref curr 5)) 2 "0"))) (string-append year month day hour minute second))) 代替list-refcadrcaddr等;这更易于阅读且不易出错。请注意,list-ref 在列表中使用从零开始的索引。

然后只需调用 cadddr 即可获取包含当前时间戳信息的字符串。如果你真的想要一个数字,你可以使用 time-stamp,或者调用 string->number 的结果,或者在返回结果之前调用 time-stamp 定义中的 string->number :

time-stamp

我在 GIMP 中运行了上面的测试,所以它显示了我当时的系统时间。以下是使用模拟测试的示例:

> (time-stamp)
"20201229133118"
> (string->number (time-stamp))
20201229133150

上面> (define (time) '(121 0 1 1 2 3)) > (time-stamp) "20210101010203" > (string->number (time-stamp)) 20210101010203 的第一个版本中有很多代码重复。对于不熟悉 Scheme 编程习惯用法的人来说,该版本可能看起来更明显,但这里有一个功能性更强的版本,删除了大量重复代码:

time-stamp
,

最后我做到了:

  (define year (+ 1900 (car (time))))
  (define month (+ 1 (cadr (time))))
  (define day (caddr(time)))
  (define hour (cadddr(time)))
  (define minute (cadr(cdddr(time))))
  (define second (caddr(cdddr(time))))

  (set! newFileName (string-append inDir pathchar inFileName
        (number->string year)
        (if (< month 10) (string-append "0" (number->string month)) (number->string month))
        (if (< day 10) (string-append "0" (number->string day)) (number->string day))
        (if (< hour 10) (string-append "0" (number->string hour)) (number->string hour))
        (if (< minute 10) (string-append "0" (number->string minute)) (number->string minute))
        (if (< second 10) (string-append "0" (number->string second)) (number->string second))
             saveString))

但我认为@ad absurdum 的答案要好得多。