我想将一个很大的数字,实际上是从unix纪元时间算起的当前时间(以秒为单位)转换为六进制字符串。
我很久以前就破解了一些代码,我认为这些代码工作在早期版本的emacs上,但它在我现在使用的emacs 23上不再起作用了(我可能搞砸了代码)。
我写这篇文章的难点在于,这个数字很大,可以作为某些函数的一个参数来处理,所以我不得不将它分开,做一些事情,然后将它们组合在一起。例如,如果给string-to-number
一个大数字,即使我想要一个整数,它也会返回一个浮点数。
有人可以建议改写吗?
以下是我写的破码。它不起作用,但可能会让你知道我想要做什么。首先,这些都是以下使用的子程序:
(defun seconds-since-origin ()
(string-to-number (concat
(number-to-string (- (string-to-number
(substring (format-time-string "%s") 0 5)
) 10000))
(substring (format-time-string "%s") 5)
)))
(defun hexatridecimal (decimal)
(concat
(let ((quotient (/ decimal 36))) (if (> quotient 35)
(hexatridecimal quotient)
(hexatridecimal-digit quotient)
))
(hexatridecimal-digit (% decimal 36))
))
(defun hexatridecimal-digit (number)
(nth number (list
"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
"k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
)
以下是将要调用的主要功能:
(hexatridecimal (seconds-since-origin))
答案 0 :(得分:2)
使用64位Emacs(可以处理您正在使用的整数),进行以下更改:
(defun seconds-since-origin ()
(string-to-number (format-time-string "%s")))
(defun hexatridecimal (decimal)
(let ((quotient (/ decimal 36))
(remainder (% decimal 36)))
(concat
(if (> quotient 0)
(hexatridecimal quotient)
"")
(hexatridecimal-digit remainder))))
注意:这确实假设一个64位Emacs,其large integers的位数比32位构建的位数多。
如果你想使用32位Emacs,可以使用calc的big-int功能为你做数学运算,并适当调整代码。
已编辑添加:
这是使用calc
的bignum功能的版本:
(require 'calc)
(require 'calc-ext)
(defun seconds-since-origin ()
(math-read-number-simple (format-time-string "%s")))
(defun hexatridecimal (decimal-bignum)
(let* ((q-r (math-idivmod decimal-bignum 36))
(quotient (car q-r))
(remainder (cdr q-r)))
(concat
(if (math-lessp 0 quotient)
(hexatridecimal quotient)
"")
(hexatridecimal-digit remainder))))