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.

View in manual

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))))))