BAR
BAR

Reputation: 17071

How to convert a binary string to an integer or a float?

I have binary strings in the form of either:

<<"5.7778345">>

or

<<"444555">>

I do not know before hand whether it will be a float or integer.

I tried doing a check to see if it is an integer. This does not work since it is binary. I alos tried converting binary to list, then check if int or float. I did not have much success with that.

It needs to be a function such as:

binToNumber(Bin) ->
  %% Find if int or float
  Return.

Anyone have a good idea of how to do this?

Upvotes: 13

Views: 12278

Answers (4)

sizif
sizif

Reputation: 344

Intermediate conversion to list is unnecessary since Erlang/OTP R16B:

-spec binary_to_number(binary()) -> float() | integer().
binary_to_number(B) ->
    try binary_to_float(B)
    catch
        error:badarg -> binary_to_integer(B)
    end.

Upvotes: 1

YOUR ARGUMENT IS VALID
YOUR ARGUMENT IS VALID

Reputation: 2059

This is the pattern that we use:

binary_to_number(B) ->
    list_to_number(binary_to_list(B)).

list_to_number(L) ->
    try list_to_float(L)
    catch
        error:badarg ->
            list_to_integer(L)
    end.

Upvotes: 15

nmichaels
nmichaels

Reputation: 50943

The binary_to_term function and its counterpart term_to_binary would probably serve you well.

Upvotes: -1

I GIVE TERRIBLE ADVICE
I GIVE TERRIBLE ADVICE

Reputation: 9648

No quick way to do it. Use something like this instead:

bin_to_num(Bin) ->
    N = binary_to_list(Bin),
    case string:to_float(N) of
        {error,no_float} -> list_to_integer(N);
        {F,_Rest} -> F
    end.

This should convert the binary to a list (string), then try to fit it in a float. When that can't be done, we return an integer. Otherwise, we keep the float and return that.

Upvotes: 23

Related Questions