| Deutsch English Français Italiano |
|
<102bi2q$1t4tk$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
Newsgroups: comp.lang.forth
Subject: Re: Parsing timestamps?
Date: Wed, 11 Jun 2025 09:25:50 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 93
Message-ID: <102bi2q$1t4tk$1@dont-email.me>
References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> <7e21117d37c506cccd8e79323c416fd1@www.novabbs.com> <1021bsd$31o0d$1@dont-email.me> <1028t95$15jgs$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Injection-Date: Wed, 11 Jun 2025 11:25:51 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="a65681a0684c26d2549e7084c784e693";
logging-data="2003892"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/+5D/tx2xUatwnwaNEuCS5"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:/Jbg0SxZHJIQUPoPaHiTDPuJlBo=
B. Pym wrote:
> 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
> >
>
> : SCAN-NUMBER-OR-SKIP ( n adr len -- n' adr' len')
> DUP >R
> 0 0 2SWAP >NUMBER
> DUP R> =
> IF 2SWAP 2DROP 1 /STRING
> ELSE
> 2>R D>S SWAP 60 * + 2R>
> THEN ;
>
> : PARSE-TIME ( adr len -- seconds)
> 0 -ROT
> BEGIN
> DUP
> WHILE
> SCAN-NUMBER-OR-SKIP
> REPEAT
> 2DROP ;
>
> S" hi 5 or 1 is 44 ho " PARSE-TIME CR .
> 18104
>
Using local variables.
: SCAN-NUMBER-OR-SKIP { n adr len -- n' adr' len' }
0. adr len >NUMBER { adr' len' } D>S { m }
len' len =
IF n adr len 1 /STRING
ELSE
n 60 * m + adr' len'
THEN ;