2010-12-01 9 views
7

を整数またはfloatへのバイナリ文字列私はどちらかの形式でバイナリ文字列を持っている:アーラン -

<<"5.7778345">> 

または

<<"444555">> 

私はそれが浮動小数点または整数になるかどうか手を前に知っていません。

整数であるかどうかをチェックしました。バイナリなので動作しません。バイナリをリストに変換しようとしましたが、intかfloatかをチェックしてください。あまり成功していない。

このような誰もがこれを行う方法の良いアイデアを持っている

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

として機能する必要がありますか?

すべてベスト

答えて

18

すぐにはできません。

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. 

これは、バイナリをリスト(文字列)に変換してから、フロートに収めるようにしてください。それができないときは、整数を返します。それ以外の場合は、フロートを保持して返します。

+0

あなたはおそらく文字列list_to_floatない欲しい:to_floatが。 –

+0

それは有効なアプローチでもあります。おそらくもっと速いでしょう。 string:to_floatはより多くのゴ​​ミを許容しますが、これは利点かもしれません。私はあなたの答えをupvoted。 –

+0

<< "123.456seven" >>は有効であると考えられますが、<< "123456seven" >>ではないので、ほとんど私はそれを提案しました。意図的にガベージ・トレラントなバージョンでも整数の場合も処理できます。 –

-1

binary_to_term関数とそれに相当する関数term_to_binaryが役に立つでしょう。

+0

この場合はありません。 'binary_to_term'と' term_to_binary'を使って変換すると、バイナリ文字列を通常のリスト/文字列に変更することをお勧めします。浮動小数点または整数は取得されません。それを行う方法については私の返信を参照してください。 –

+2

@ITIFBLE ADVICE:最初にバイナリを取得するために 'term_to_binary'を使うことを提案しました。その後、変換は簡単です。もちろん、営業担当者がデータがどこから来るのかを制御できない場合、それはまだ完全に非現実的である可能性があります。 – nmichaels

+0

その意味では意味があります。 –

12

これは、我々が使用するパターンです:

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.