org-table: new defcustom `org-table-duration-custom-format'.
[org-mode.git] / lisp / org-table.el
index 4d35ff9..2149376 100644 (file)
@@ -231,6 +231,18 @@ relies on the variables to be present in the list."
   :group 'org-table-calculation
   :type 'plist)
 
+(defcustom org-table-duration-custom-format 'hours
+  "Format for the output of calc computations like $1+$2;t.
+The default value is 'hours, and will output the results as a
+number of hours.  Other allowed values are 'seconds, 'minutes and
+'days, and the output will be a fraction of seconds, minutes or
+days."
+  :group 'org-table-calculation
+  :type '(choice (symbol :tag "Seconds" 'seconds)
+                (symbol :tag "Minutes" 'minutes)
+                (symbol :tag "Hours  " 'hours)
+                (symbol :tag "Days   " 'days)))
+
 (defcustom org-table-formula-evaluate-inline t
   "Non-nil means TAB and RET evaluate a formula in current table field.
 If the current field starts with an equal sign, it is assumed to be a formula
@@ -2412,6 +2424,12 @@ not overwrite the stored one."
              (setq fmt (replace-match "" t t fmt)))
            (if (string-match "T" fmt)
                (setq duration t numbers t
+                     duration-output-format nil
+                     fmt (replace-match "" t t fmt)))
+           (if (string-match "t" fmt)
+               (setq duration t 
+                     duration-output-format org-table-duration-custom-format
+                     numbers t
                      fmt (replace-match "" t t fmt)))
            (if (string-match "N" fmt)
                (setq numbers t
@@ -2523,12 +2541,14 @@ not overwrite the stored one."
                       (error "#ERROR"))
                  ev (if (numberp ev) (number-to-string ev) ev)
                  ev (if duration (org-table-time-seconds-to-string
-                                  (string-to-number ev)) ev))
+                                  (string-to-number ev)
+                                  duration-output-format) ev))
          (or (fboundp 'calc-eval)
              (error "Calc does not seem to be installed, and is needed to evaluate the formula"))
          (setq ev (calc-eval (cons form modes) (if numbers 'num))
                ev (if duration (org-table-time-seconds-to-string
-                                (string-to-number ev)) ev)))
+                                (string-to-number ev)
+                                duration-output-format) ev)))
 
        (when org-table-formula-debug
          (with-output-to-temp-buffer "*Substitution History*"
@@ -3237,9 +3257,19 @@ If S is a string representing a number, keep this number."
      (t (setq res (string-to-number s))))
     (number-to-string res)))
 
-(defun org-table-time-seconds-to-string (secs)
-  "Convert a number of seconds to a time string."
-  (org-format-seconds "%.2h:%.2m:%.2s" secs))
+(defun org-table-time-seconds-to-string (secs &optional output-format)
+  "Convert a number of seconds to a time string.
+If OUTPUT-FORMAT is non-nil, return a number of days, hours,
+minutes or seconds."
+  (cond ((eq output-format 'days)
+        (format "%.3f" (/ (float secs) 86400)))
+       ((eq output-format 'hours)
+        (format "%.2f" (/ (float secs) 3600)))
+       ((eq output-format 'minutes)
+        (format "%.1f" (/ (float secs) 60)))
+       ((eq output-format 'seconds)
+        (format "%d" secs))
+       (t (org-format-seconds "%.2h:%.2m:%.2s" secs))))
 
 (defun org-table-fedit-convert-buffer (function)
   "Convert all references in this buffer, using FUNCTION."