home bbs files messages ]

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 117,513 of 117,927   
   B. Pym to B. Pym   
   Re: Parsing timestamps?   
   29 Jul 25 15:07:23   
   
   From: Nobody447095@here-nor-there.org   
      
   B. Pym wrote:   
      
   > mhx wrote:   
   >   
   > > On Sun, 6 Oct 2024 7:51:31 +0000, 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   
   > >   
   > > Why don't you use the fact that >NUMBER returns the given   
   > > string starting with the first unconverted character?   
   > > SPLIT should be redundant.   
   > >   
   > > -marcel   
   >   
   > : CHAR-NUMERIC?   48 58 WITHIN ;   
   > : SKIP-NON-NUMERIC ( adr u -- adr2 u2)   
   >   BEGIN   
   >     DUP IF  OVER C@ CHAR-NUMERIC? NOT  ELSE  0 THEN   
   >   WHILE   
   >     1 /STRING   
   >   REPEAT ;   
   >   
   > : SCAN-NEXT-NUMBER ( n adr len -- n2 adr2 len2)   
   >   2>R  60 *  0.  2R> >NUMBER   
   >   2>R  D>S +  2R> ;   
   >   
   > : PARSE-TIME  ( adr len -- seconds)   
   >   0 -ROT   
   >   BEGIN   
   >     SKIP-NON-NUMERIC   
   >     DUP   
   >   WHILE   
   >     SCAN-NEXT-NUMBER   
   >   REPEAT   
   >   2DROP ;   
   >   
   > S" hello 1::36 world" PARSE-TIME CR .   
   > 96  ok   
   >   
      
   : get-number ( accum adr len -- accum' adr' len' )   
     { adr len }   
     0. adr len >number { adr' len' }   
     len len' =   
     if   
       2drop  adr len 1 /string   
     else   
       d>s swap 60 * +   
       adr' len'   
     then ;   
      
   : parse-time  ( adr len -- seconds)   
     0 -rot   
     begin   
       dup   
     while   
       get-number   
     repeat   
     2drop ;   
      
   s" foo-bar" parse-time . 0   
   s" foo55bar" parse-time . 55   
   s" foo 1 bar 55 zoo" parse-time . 155   
   s" and9foo 1 bar 55 zoo" parse-time . 32515   
      
   --- 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