Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 116,845 of 117,927    |
|    Ruvim to Ruvim    |
|    Re: Parsing timestamps?    |
|    06 Oct 24 17:34:27    |
      From: ruvim.pinka@gmail.com              On 2024-10-06 17:22, Ruvim wrote:       > On 2024-10-06 15:59, dxf wrote:       >> On 6/10/2024 9:48 pm, Ruvim wrote:       >>> On 2024-10-06 11:51, dxf wrote:       >>>> Is there an easier way of doing this? End goal is a double number       >>>> representing centi-secs.       >>>>       >>>>       >>>> empty decimal       >>>>       >>>> : SPLIT ( a u c -- a2 u2 a3 u3 ) >r 2dup r> scan 2swap 2 pick - ;       >>>> : >INT ( adr len -- u ) 0 0 2swap >number 2drop drop ;       >>>>       >>>> : /T ( a u -- $hour $min $sec )       >>>> 2 0 do [char] : split 2swap dup if 1 /string then loop       >>>> 2 0 do dup 0= if 2rot 2rot then loop ;       >>>>       >>>> : .T 2swap 2rot cr >int . ." hr " >int . ." min " >int . ." sec "              >>>>       >>>> s" 1:2:3" /t .t       >>>> s" 02:03" /t .t       >>>> s" 03" /t .t       >>>> s" 23:59:59" /t .t       >>>> s" 0:00:03" /t .t       >>>       >>>       >>> I would use `split-string` factor as:       >>>       >>> : /t ( sd.time -- sd.hour sd.min sd.sec )       >>> s" :" split-string       >>> s" :" split-string       >>> ;       >>>       >>> \ Where       >>>       >>> : split-string       >>> ( sd.text sd.separator -- sd.left sd.right | sd.text 0 0 )       >>> dup >r 3 pick >r ( R: u.[sd.separator][1] addr.[st.text][2] )       >>> search 0= if 2rdrop 0 0 exit then ( addr u )       >>> over r@ - r> swap 2swap r> /string       >>> ;       >>       >> It fails with s" 03". The test case may be unreasonable so I tried       >> s" :03" however it also fails. The complication is most tools scan       >> from the beginning whereas we would like to scan from the end.       >       >       > You did not provide output for test cases.       >       > I expect that "03" is equivalent to "03:00:00", which means 3 hours, 0       > minutes, 0 seconds.       > And ":03" is equivalent to "00:03:00", which means 0 hours, 3 minutes, 0       > seconds.       >       > My above implementation for `/t` produces:       >       > s" 1:2:3" /t .t \ "1 hr 2 min 3 sec"       > s" 02:03" /t .t \ "2 hr 3 min 0 sec"       > s" 03" /t .t \ "3 hr 0 min 0 sec"       > s" :03" /t .t \ "0 hr 3 min 0 sec"       >       >       > What is wrong?       >       > Maybe your `>int` works incorrectly with an empty string?       >       >       > For testing I use:       >       > : >int ( sd.number -- u ) 0. 2swap >number 2drop drop ;       > \ the empty string produces 0                     Oh, I missed your definition for ">INT", because you use ">int" (sic       lower case) in your definition for ".T"                     Then, it's unclear what fails on your side.                     --       Ruvim              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca