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