2008-06-25 04:25:08 -04:00
|
|
|
USING: io kernel math math.functions math.parser parser lexer
|
2008-09-10 23:11:40 -04:00
|
|
|
namespaces make sequences splitting grouping combinators
|
2008-10-02 18:51:08 -04:00
|
|
|
continuations ;
|
2008-02-11 17:21:59 -05:00
|
|
|
IN: money
|
|
|
|
|
2008-11-29 13:03:07 -05:00
|
|
|
SYMBOL: currency-token
|
|
|
|
CHAR: $ \ currency-token set-global
|
|
|
|
|
2008-02-11 17:21:59 -05:00
|
|
|
: dollars/cents ( dollars -- dollars cents )
|
|
|
|
100 * 100 /mod round ;
|
|
|
|
|
2008-11-29 13:03:07 -05:00
|
|
|
: (money>string) ( dollars cents -- string )
|
|
|
|
[ number>string ] bi@
|
|
|
|
[ <reversed> 3 group "," join <reversed> ]
|
2009-01-29 23:19:07 -05:00
|
|
|
[ 2 CHAR: 0 pad-head ] bi* "." glue ;
|
2008-11-29 13:03:07 -05:00
|
|
|
|
2008-09-06 14:58:14 -04:00
|
|
|
: money>string ( object -- string )
|
2008-11-29 13:03:07 -05:00
|
|
|
dollars/cents (money>string) currency-token get prefix ;
|
2008-09-06 14:58:14 -04:00
|
|
|
|
2008-11-29 13:03:07 -05:00
|
|
|
: money. ( object -- ) money>string print ;
|
2008-02-11 17:21:59 -05:00
|
|
|
|
2008-11-29 13:03:07 -05:00
|
|
|
ERROR: not-an-integer x ;
|
2008-02-11 17:45:38 -05:00
|
|
|
|
|
|
|
: parse-decimal ( str -- ratio )
|
|
|
|
"." split1
|
2008-11-29 13:03:07 -05:00
|
|
|
[ "-" ?head swap ] dip
|
2008-09-06 18:15:25 -04:00
|
|
|
[ [ "0" ] when-empty ] bi@
|
2008-11-29 13:03:07 -05:00
|
|
|
[
|
2015-08-13 19:13:05 -04:00
|
|
|
[ dup string>number [ nip ] [ not-an-integer ] if* ] bi@
|
2008-11-29 13:03:07 -05:00
|
|
|
] keep length
|
2009-08-11 19:00:24 -04:00
|
|
|
10^ / + swap [ neg ] when ;
|
2008-02-11 17:45:38 -05:00
|
|
|
|
2011-09-27 16:20:07 -04:00
|
|
|
SYNTAX: DECIMAL: scan-token parse-decimal suffix! ;
|