Function: seconds-to-string
seconds-to-string is an autoloaded and byte-compiled function defined
in time-date.el.gz.
Signature
(seconds-to-string DELAY &optional READABLE ABBREV PRECISION)
Documentation
Convert time interval DELAY (in seconds) to a string.
By default, the returned string is formatted as a float in the smallest
unit from the variable seconds-to-string(var)/seconds-to-string(fun) that is longer than DELAY,
and a precision of two. If READABLE is non-nil, convert DELAY into a
readable string, using the information provided in the variable
seconds-to-string-readable. If it is the symbol expanded, use two
units to describe DELAY, if appropriate. E.g. "1 hour 32 minutes".
If ABBREV is non-nil, abbreviate the readable units. If PRECISION is a
whole number, round the value associated with the smallest displayed
unit to that many digits after the decimal. If it is a non-negative
float less than 1.0, round to that value.
Probably introduced at or before Emacs version 31.1.
Source Code
;; Defined in /usr/src/emacs/lisp/calendar/time-date.el.gz
;;;###autoload
(defun seconds-to-string (delay &optional readable abbrev precision)
"Convert time interval DELAY (in seconds) to a string.
By default, the returned string is formatted as a float in the smallest
unit from the variable `seconds-to-string' that is longer than DELAY,
and a precision of two. If READABLE is non-nil, convert DELAY into a
readable string, using the information provided in the variable
`seconds-to-string-readable'. If it is the symbol `expanded', use two
units to describe DELAY, if appropriate. E.g. \"1 hour 32 minutes\".
If ABBREV is non-nil, abbreviate the readable units. If PRECISION is a
whole number, round the value associated with the smallest displayed
unit to that many digits after the decimal. If it is a non-negative
float less than 1.0, round to that value."
(cond ((< delay 0)
(concat "-" (seconds-to-string (- delay) readable precision)))
(readable
(let* ((stsa seconds-to-string-readable)
(expanded (eq readable 'expanded))
digits
(round-to (cond ((wholenump precision)
(setq digits precision)
(expt 10 (- precision)))
((and (floatp precision) (< precision 1.))
(setq digits (- (floor (log precision 10))))
precision)
(t (setq digits 0) 1)))
(dformat (if (> digits 0) (format "%%0.%df" digits)))
(padding (if abbrev "" " "))
here cnt cnt-pre here-pre cnt-val isfloatp)
(if (= (round delay round-to) 0)
(format "0%s" (if abbrev "s" " seconds"))
(while (and (setq here (pop stsa)) stsa
(< (/ delay (nth 3 here)) 1)))
(or (and
expanded stsa ; smaller unit remains
(progn
(setq
here-pre here here (car stsa)
cnt-pre (floor (/ (float delay) (nth 3 here-pre)))
cnt (round
(/ (- (float delay) (* cnt-pre (nth 3 here-pre)))
(nth 3 here))
round-to))
(if (> cnt 0) t (setq cnt cnt-pre here here-pre here-pre nil))))
(setq cnt (round (/ (float delay) (nth 3 here)) round-to)))
(setq cnt-val (* cnt round-to)
isfloatp (and (> digits 0)
(> (- cnt-val (floor cnt-val)) 0.)))
(cl-labels
((unit (val here &optional plural)
(cond (abbrev (car here))
((and (not plural) (<= (floor val) 1)) (nth 1 here))
(t (nth 2 here)))))
(concat
(when here-pre
(concat (number-to-string cnt-pre) padding
(unit cnt-pre here-pre) " "))
(if isfloatp (format dformat cnt-val)
(number-to-string (floor cnt-val)))
padding
(unit cnt-val here isfloatp)))))) ; float formats are always plural
((= 0 delay) "0s")
(t (let ((sts seconds-to-string) here)
(while (and (car (setq here (pop sts)))
(<= (car here) delay)))
(concat (format "%.2f" (/ delay (car (cddr here)))) (cadr here))))))