# Re: [O] Calc: Multiply time (hours) with a float

```* Michael Welle <mwe012...@gmx.net> wrote:
> Hello,

Hello Michael,```
```
> Karl Voit <devn...@karl-voit.at> writes:
>
>> * Karl Voit <devn...@karl-voit.at> wrote:
>>> Hi!
>>>
>>> I do have following situation: I'd like to multiply a float with hours
>>> which results in an error, obviously. However, I was not able to find
>>> out how to do it.
>>>
>>> Minimal example with expected product:
>>>
>>> | time [h:m:s] |   value | h * value |
>>> |--------------+---------+-----------|
>>> |     09:15:00 | 2.54321 | 23.524693 |
>>>  #+TBLFM: @2\$3=\$2*\$1
>>
> do you really need the result to be in decimal notation?

If I want to implement my original idea (see my original posting):
yes.

> If not,
> #+TBLFM:@2\$3=\$2*\$1;T would work. If you need decimal notation you have
> to provide your own function, I think.

So I wrote some Elisp code:

(defun org-time-string-to-seconds (s)
"Convert a string HH:MM:SS to a number of seconds.
Omitted third element will be interpreted as MM:SS with missing hours."
;; test with:
;; (message (concat "result is: " (number-to-string
(org-time-string-to-seconds "57:45:03"))))
;; (message (concat "result is: " (number-to-string
(org-time-string-to-seconds "57:45"))))
(cond
((and (stringp s)
(string-match "\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)" s))
(let ((hour (string-to-number (match-string 1 s)))
(min (string-to-number (match-string 2 s)))
(sec (string-to-number (match-string 3 s))))
(+ (* hour 3600) (* min 60) sec)))
((and (stringp s)
(string-match "\\([0-9]+\\):\\([0-9]+\\)" s))
(let ((min (string-to-number (match-string 1 s)))
(sec (string-to-number (match-string 2 s))))
(+ (* min 60) sec)))
;;((stringp s) (string-to-number s))
;;(t s)
)
)

(defun org-time-string-to-hours (s)
"Convert a string HH:MM:SS to hours (float).
When only two values given, they will be interpreted as MM:SS with missing
hours."
;; test via:
;; (message (concat "result is: " (number-to-string
(org-time-string-to-hours "57:45:03"))))
;; (message (concat "result is: " (number-to-string
(org-time-string-to-hours "57:45"))))
(/ (org-time-string-to-seconds s) 3600.0)
)

... which is working:

| time [h:m:s] |   value | hours [float] |   product |
|--------------+---------+---------------+-----------|
|     09:15:00 | 2.54321 |          9.25 | 23.524693 |
#+TBLFM: \$4=\$2*\$3::@2\$3='(org-time-string-to-hours \$1)

However, when I try to calculate the product in one step, I get an error:

| time [h:m:s] |   value | product |
|--------------+---------+---------|
|     09:15:00 | 2.54321 | #ERROR  |
#+TBLFM: @2\$3='(* \$2 (org-time-string-to-hours \$1))

When I replace "\$2" in TBLFM with an integer value, it works.

How can I calculate the product in /one/ step?

Thanks again!

--
> get Memacs from https://github.com/novoid/Memacs <

https://github.com/novoid/extract_pdf_annotations_to_orgmode + more on github

```