Re: Parsing timestamps?

Liste des GroupesRevenir à cl forth 
Sujet : Re: Parsing timestamps?
De : the.beez.speaks (at) *nospam* gmail.com (Hans Bezemer)
Groupes : comp.lang.forth
Date : 28. Oct 2024, 18:07:32
Autres entêtes
Organisation : KPN B.V.
Message-ID : <nnd$20ac8605$11da13fb@384eaef047f1a2fb>
References : 1 2 3
User-Agent : Mozilla Thunderbird
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

Date Sujet#  Auteur
6 Oct 24 * Parsing timestamps?45dxf
6 Oct 24 +* Re: Parsing timestamps?8mhx
6 Oct 24 i+* Re: Parsing timestamps?3dxf
6 Oct 24 ii`* Re: Parsing timestamps?2dxf
7 Oct 24 ii `- Re: Parsing timestamps?1dxf
7 Jun13:38 i`* Re: Parsing timestamps?4B. Pym
7 Jun15:36 i `* Re: Parsing timestamps?3dxf
7 Jun18:07 i  `* Re: Parsing timestamps?2LIT
8 Jun03:38 i   `- Re: Parsing timestamps?1dxf
6 Oct 24 +* Re: Parsing timestamps?5Ruvim
6 Oct 24 i`* Re: Parsing timestamps?4dxf
6 Oct 24 i `* Re: Parsing timestamps?3Ruvim
6 Oct 24 i  +- Re: Parsing timestamps?1Ruvim
6 Oct 24 i  `- Re: Parsing timestamps?1Ruvim
6 Oct 24 +* Re: Parsing timestamps?6FFmike
6 Oct 24 i`* Re: Parsing timestamps?5FFmike
7 Oct 24 i `* Re: Parsing timestamps?4dxf
7 Oct 24 i  `* Re: Parsing timestamps?3FFmike
7 Oct 24 i   `* Re: Parsing timestamps?2dxf
7 Oct 24 i    `- Re: Parsing timestamps?1FFmike
6 Oct 24 +* Re: Parsing timestamps?2Anthony Howe
7 Oct 24 i`- Re: Parsing timestamps?1dxf
7 Oct 24 +* Re: Parsing timestamps?9albert
7 Oct 24 i`* Re: Parsing timestamps?8dxf
7 Oct 24 i `* Re: Parsing timestamps?7sjack
8 Oct 24 i  `* Re: Parsing timestamps?6dxf
8 Oct 24 i   +* Re: Parsing timestamps?3Ahmed
8 Oct 24 i   i+- Re: Parsing timestamps?1dxf
8 Oct 24 i   i`- Re: Parsing timestamps?1sjack
8 Oct 24 i   `* Re: Parsing timestamps?2sjack
9 Oct 24 i    `- Re: Parsing timestamps?1dxf
8 Oct 24 +* Re: Parsing timestamps?3albert
8 Oct 24 i`* Re: Parsing timestamps?2dxf
8 Oct 24 i `- Re: Parsing timestamps?1Ahmed
9 Oct 24 +* Re: Parsing timestamps?4alaa
10 Oct 24 i+* Re: Parsing timestamps?2dxf
10 Oct 24 ii`- Re: Parsing timestamps?1alaa
16 Oct 24 i`- Re: Parsing timestamps?1Hans Bezemer
18 Oct 24 `* Re: Parsing timestamps?7Gerry Jackson
19 Oct 24  `* Re: Parsing timestamps?6dxf
28 Oct 24   `* Re: Parsing timestamps?5Hans Bezemer
29 Oct 24    `* Re: Parsing timestamps?4dxf
29 Oct 24     `* Re: Parsing timestamps?3Hans Bezemer
30 Oct 24      `* Re: Parsing timestamps?2dxf
31 Oct 24       `- Re: Parsing timestamps?1dxf

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal