require numeric literals to begin and end with a digit/decimal point so that stuff like "," and "1," don't parse as numbers

db4
Joe Groff 2009-09-01 21:14:26 -05:00
parent d2bef9e32a
commit 1a04bc1124
2 changed files with 24 additions and 8 deletions

View File

@ -25,13 +25,18 @@ unit-test
[ "e" string>number ]
unit-test
[ 100000 ]
[ "100,000" string>number ]
unit-test
[ 100000 ] [ "100,000" string>number ] unit-test
[ 100000.0 ]
[ "100,000.0" string>number ]
unit-test
[ 100000.0 ] [ "100,000.0" string>number ] unit-test
[ f ] [ "," string>number ] unit-test
[ f ] [ "-," string>number ] unit-test
[ f ] [ "1," string>number ] unit-test
[ f ] [ "-1," string>number ] unit-test
[ f ] [ ",2" string>number ] unit-test
[ f ] [ "-,2" string>number ] unit-test
[ 2.0 ] [ "2." string>number ] unit-test
[ "100.0" ]
[ "1.0e2" string>number number>string ]

View File

@ -86,16 +86,27 @@ SYMBOL: negative?
[ CHAR: , eq? not ] filter
>byte-array 0 suffix (string>float) ;
: number-char? ( char -- ? )
"0123456789." member? ;
: numeric-looking? ( str -- ? )
"-" ?head drop
dup empty? [ drop f ] [
dup first number-char? [
last number-char?
] [ drop f ] if
] if ;
PRIVATE>
: base> ( str radix -- n/f )
over empty? [ 2drop f ] [
over numeric-looking? [
over [ "/." member? ] find nip {
{ CHAR: / [ string>ratio ] }
{ CHAR: . [ drop string>float ] }
[ drop string>integer ]
} case
] if ;
] [ 2drop f ] if ;
: string>number ( str -- n/f ) 10 base> ;
: bin> ( str -- n/f ) 2 base> ;