[erlang-questions] fread() for numbers - beginner question

Robert Raschke rtrlists@REDACTED
Mon Apr 20 12:57:22 CEST 2009


On Mon, Apr 20, 2009 at 10:43 AM, BranchingFactor
<branchingfactor@REDACTED> wrote:
> I'd like to io_lib:fread() a number from a string.  Unfortunately, if I use
> "~f" for floating point number, then fread rejects numbers that don't have
> fractional parts:
>
>> io_lib:fread("~f", "1").
> {error,{fread,float}}
>> io_lib:fread("~f", "1.").
> {error,{fread,float}}
>
> (I find this very strange, since both 1 and 1. can be represented in a
> floating point number.)
> And if I use "~d" for decimal integers, then fread won't read past the
> decimal point:
>
>> io_lib:fread("~d", "1.0").
> {ok,[1],".0"}
>
> What is the easiest way to scan a number from a string in erlang?  Ideally
> it would scan any number in any input format and return an Erlang object
> that satisfied the is_number() predicate.

scan_number(S) ->
    case io_lib:fread("~f", S) of
        {error, _} -> io_lib:fread("~d", S);
        Result -> Result
    end.

This doesn't handle 16#ffff and friends though. but you can extend it
according to you needs.

And "1." is not a valid Erlang number.

Robby



More information about the erlang-questions mailing list