Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #132501

Re: Parsing timestamps?

Date 2024-10-28 18:07 +0100
Subject Re: Parsing timestamps?
Newsgroups comp.lang.forth
References <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> <vetsc2$3av44$1@dont-email.me> <a8021708d18be9f53cfa1ab6a6627eaa03121612@i2pn2.org>
From Hans Bezemer <the.beez.speaks@gmail.com>
Message-ID <nnd$20ac8605$11da13fb@384eaef047f1a2fb> (permalink)
Organization KPN B.V.

Show all headers | View raw


On 19-10-2024 03:29, dxf wrote:
 > On 19/10/2024 1:46 am, Gerry Jackson wrote:
 >> On 06/10/2024 08: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
 >>
 >> Another solution
 >>
 >> : /t  ( ca u -- sec min hour )
 >>     3        \ a count, decremented every recurse
 >>     [: -rot dup 0>
 >>        if 0. 2swap >number 1 /string 2swap drop ( -- ct ca' u' n1 )
 >>           >r rot 1-
 >>           recurse r> swap exit
 >>        then 2drop
 >>     ;] execute
 >>     0 ?do 0 loop   \ 0 hours and minutes if missing in source string
 >> ;
 >> : .t   cr . ." hr "  . ." min " . ." sec " ;
 >>
 >> cr
 >> 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
 >> s" " /t .t
 >> s" :" /t .t
 >> s" :53" /t .t
 >> s" 11/12/13" /t .t   \ Different separator
 >> s" 11::13" /t .t
 >> s" :::" /t .t
 >> s" 3:" /t .t
 >> s" 1:2:" /t .t
 >>
 >> \ Results
 >> 1 hr 2 min 3 sec
 >> 0 hr 2 min 3 sec
 >> 0 hr 0 min 3 sec
 >> 23 hr 59 min 59 sec
 >> 0 hr 0 min 3 sec
 >> 0 hr 0 min 0 sec
 >> 0 hr 0 min 0 sec
 >> 0 hr 0 min 53 sec
 >> 11 hr 12 min 13 sec
 >> 11 hr 0 min 13 sec
 >> 0 hr 0 min 0 sec
 >> 0 hr 0 min 3 sec
 >> 0 hr 1 min 2 sec
 >>
 >> The last two could be regarded as wrong but you indicated elsewhere 
that they wouldn't occur.
 >
 > In practice several others too as separators in isolation are unlikely.
 >
 >> Any non-digit is a separator
 >
 > That prompted me to look at sjack's code again and found SPLIT could 
be omitted:
 >
 >   : (number) ( a u -- ud a' u' )  0 0 2swap >number ;
 >
 >   : /int ( a u -- a' u' u2 )  (number) 2swap drop ;
 >
 >   : .t   cr . ." hr "  . ." min " . ." sec " ;
 >
 >   : /t ( a u -- sec min hr )
 >     2>r  0 0 0  2r>  begin
 >       /int  5 roll drop  -rot  dup while  1 /string
 >     repeat 2drop  swap rot ;
 >
 >
 > 1 hr 2 min 3 sec  ok
 > 0 hr 2 min 3 sec  ok
 > 0 hr 0 min 3 sec  ok
 > 23 hr 59 min 59 sec  ok
 > 0 hr 0 min 3 sec  ok
 > 0 hr 0 min 0 sec  ok
 > 0 hr 0 min 0 sec  ok
 > 0 hr 0 min 53 sec  ok
 > 11 hr 12 min 13 sec  ok
 > 11 hr 0 min 13 sec  ok
 > 0 hr 0 min 0 sec  ok
 > 0 hr 3 min 0 sec  ok
 > 1 hr 2 min 0 sec  ok
 >
I have put the complication elsewhere. If we assume we're working in 
decimal, you don't even need >NUMBER:

char 0 negate +constant 0-

: /int    ( a1 n1 -- a2 n2 n3)
   0 >r 1 >r 1- chars over +
   begin
    over 1- over <
   while
     dup c@ is-digit
   while
     dup c@ 0- r> tuck * r> + >r 10 * >r 1-
   repeat over - rdrop r> -rot
;

: /t /int /int /int 2drop ;

: .t . ." hr "  . ." min " . ." sec " cr ;

Notes for 4tH-isms:
- : 0- [char] 0 - ;
- : is-digit [char] 0 [char] 9 1+ within ;
- Add an additional THEN after REPEAT;
- RDROP, replace with R> DROP.

pp4th -x timesplit.4th
1 hr 2 min 3 sec
0 hr 2 min 3 sec
0 hr 0 min 3 sec
23 hr 59 min 59 sec
0 hr 0 min 3 sec
0 hr 0 min 0 sec
0 hr 0 min 0 sec
0 hr 0 min 53 sec
11 hr 12 min 13 sec
11 hr 0 min 13 sec
0 hr 0 min 0 sec
0 hr 3 min 0 sec
1 hr 2 min 0 sec

Hans Bezemer

Back to comp.lang.forth | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-06 18:51 +1100
  Re: Parsing timestamps? mhx@iae.nl (mhx) - 2024-10-06 08:59 +0000
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-06 23:58 +1100
      Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-07 02:34 +1100
        Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-07 23:53 +1100
  Re: Parsing timestamps? Ruvim <ruvim.pinka@gmail.com> - 2024-10-06 14:48 +0400
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-06 22:59 +1100
      Re: Parsing timestamps? Ruvim <ruvim.pinka@gmail.com> - 2024-10-06 17:22 +0400
        Re: Parsing timestamps? Ruvim <ruvim.pinka@gmail.com> - 2024-10-06 17:34 +0400
        Re: Parsing timestamps? Ruvim <ruvim.pinka@gmail.com> - 2024-10-06 20:15 +0400
  Re: Parsing timestamps? oh2aun@gmail.com (FFmike) - 2024-10-06 13:08 +0000
    Re: Parsing timestamps? oh2aun@gmail.com (FFmike) - 2024-10-06 13:33 +0000
      Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-07 13:10 +1100
        Re: Parsing timestamps? oh2aun@gmail.com (FFmike) - 2024-10-07 03:29 +0000
          Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-07 14:58 +1100
            Re: Parsing timestamps? oh2aun@gmail.com (FFmike) - 2024-10-07 05:23 +0000
  Re: Parsing timestamps? Anthony Howe <achowe@snert.com> - 2024-10-06 11:35 -0400
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-07 12:54 +1100
  Re: Parsing timestamps? albert@spenarnc.xs4all.nl - 2024-10-07 13:00 +0200
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-07 22:30 +1100
      Re: Parsing timestamps? sjack@dontemail.me (sjack) - 2024-10-07 16:20 +0000
        Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-08 14:07 +1100
          Re: Parsing timestamps? melahi_ahmed@yahoo.fr (Ahmed) - 2024-10-08 06:08 +0000
            Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-08 18:33 +1100
            Re: Parsing timestamps? sjack@dontemail.me (sjack) - 2024-10-08 15:19 +0000
          Re: Parsing timestamps? sjack@dontemail.me (sjack) - 2024-10-08 20:30 +0000
            Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-09 12:06 +1100
  Re: Parsing timestamps? albert@spenarnc.xs4all.nl - 2024-10-08 09:41 +0200
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-08 19:55 +1100
      Re: Parsing timestamps? melahi_ahmed@yahoo.fr (Ahmed) - 2024-10-08 18:12 +0000
  Re: Parsing timestamps? amalawi@gmail.com (alaa) - 2024-10-09 15:27 +0000
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-10 12:17 +1100
      Re: Parsing timestamps? amalawi@gmail.com (alaa) - 2024-10-10 16:30 +0000
    Re: Parsing timestamps? Hans Bezemer <the.beez.speaks@gmail.com> - 2024-10-16 18:29 +0200
  Re: Parsing timestamps? Gerry Jackson <do-not-use@swldwa.uk> - 2024-10-18 15:46 +0100
    Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-19 12:29 +1100
      Re: Parsing timestamps? Hans Bezemer <the.beez.speaks@gmail.com> - 2024-10-28 18:07 +0100
        Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-29 20:25 +1100
          Re: Parsing timestamps? Hans Bezemer <the.beez.speaks@gmail.com> - 2024-10-29 14:45 +0100
            Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-30 11:31 +1100
              Re: Parsing timestamps? Hans Bezemer <the.beez.speaks@gmail.com> - 2024-10-30 09:37 +0100
                Re: Parsing timestamps? dxf <dxforth@gmail.com> - 2024-10-31 11:41 +1100

csiph-web