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

BranchingFactor branchingfactor@REDACTED
Mon Apr 20 18:02:05 CEST 2009


Thanks for the quick reply,   Robbi.    I was hoping to avoid the try-and-try-again approach b/c it doesn't extend so nicely to scanning multiple items from a string.  Does Erlang provide any way to read what many other programming languages consider to be the printed representation of a number?

--- On Mon, 4/20/09, Robert Raschke <rtrlists@REDACTED> wrote:
From: Robert Raschke <rtrlists@REDACTED>
Subject: Re: [erlang-questions] fread() for numbers - beginner question
To: branchingfactor@REDACTED
Cc: erlang-questions@REDACTED
Date: Monday, April 20, 2009, 6:57 AM

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



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20090420/4a10cfaf/attachment.htm>


More information about the erlang-questions mailing list