| Deutsch English Français Italiano |
|
<vdu2vc$151ad$3@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Ruvim <ruvim.pinka@gmail.com> Newsgroups: comp.lang.forth Subject: Re: Parsing timestamps? Date: Sun, 6 Oct 2024 17:22:53 +0400 Organization: A noiseless patient Spider Lines: 74 Message-ID: <vdu2vc$151ad$3@dont-email.me> References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> <vdtptd$151ad$1@dont-email.me> <923a7df6941efa78ef7d0629d183cd736f9eb2f5@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sun, 06 Oct 2024 15:22:53 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e46068a955d916fa6a0f28fb20080d2c"; logging-data="1213773"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19m6M9b9ykfsfcnuZ32u2k+" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:KtyZ2sOAZEtHZiFcO5FFnWSJO2o= Content-Language: en-US In-Reply-To: <923a7df6941efa78ef7d0629d183cd736f9eb2f5@i2pn2.org> Bytes: 3234 On 2024-10-06 15:59, dxf wrote: > On 6/10/2024 9:48 pm, Ruvim wrote: >> On 2024-10-06 11: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 >> >> >> I would use `split-string` factor as: >> >> : /t ( sd.time -- sd.hour sd.min sd.sec ) >> s" :" split-string >> s" :" split-string >> ; >> >> \ Where >> >> : split-string >> ( sd.text sd.separator -- sd.left sd.right | sd.text 0 0 ) >> dup >r 3 pick >r ( R: u.[sd.separator][1] addr.[st.text][2] ) >> search 0= if 2rdrop 0 0 exit then ( addr u ) >> over r@ - r> swap 2swap r> /string >> ; > > It fails with s" 03". The test case may be unreasonable so I tried > s" :03" however it also fails. The complication is most tools scan > from the beginning whereas we would like to scan from the end. You did not provide output for test cases. I expect that "03" is equivalent to "03:00:00", which means 3 hours, 0 minutes, 0 seconds. And ":03" is equivalent to "00:03:00", which means 0 hours, 3 minutes, 0 seconds. My above implementation for `/t` produces: s" 1:2:3" /t .t \ "1 hr 2 min 3 sec" s" 02:03" /t .t \ "2 hr 3 min 0 sec" s" 03" /t .t \ "3 hr 0 min 0 sec" s" :03" /t .t \ "0 hr 3 min 0 sec" What is wrong? Maybe your `>int` works incorrectly with an empty string? For testing I use: : >int ( sd.number -- u ) 0. 2swap >number 2drop drop ; \ the empty string produces 0 -- Ruvim