2010-12-01 13 views
7

mam ciągów binarnych w postaci albo:Erlang - ciąg binarny do Integer lub unosić

<<"5.7778345">> 

lub

<<"444555">> 

nie wiem przed strony, czy będzie to pływak lub całkowita .

Próbowałem sprawdzić, czy jest to liczba całkowita. Nie działa, ponieważ jest binarny. I próbował konwersji binarnych do listy, a następnie sprawdź, czy int lub float. Niezły sukces z tym.

To musi być funkcją takich jak

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

ktoś ma dobry pomysł, jak to zrobić?

Wszystkie najlepsze

Odpowiedz

18

Nie można tego szybko zrobić. Zamiast tego użyj czegoś takiego:

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. 

Powinno to przekonwertować plik binarny na listę (łańcuch), a następnie spróbuj dopasować go w float. Kiedy nie można tego zrobić, zwracamy liczbę całkowitą. W przeciwnym razie utrzymujemy float i zwrócę to.

+0

Prawdopodobnie chcesz list_to_float nie ciąg: to_float. –

+0

Byłoby to również prawidłowe podejście, tak. Prawdopodobnie szybciej. string: to_float będzie tolerować więcej śmieci, co może, ale nie musi być zaletą. Przegłosowałem twoją odpowiedź. –

+0

Zasugerowałem to głównie dlatego, że << "123.456seven" >> zostałoby uznane za ważne, ale nie << "123456seven" >>. Wersja celowo odporna na śmieci mogłaby również obsłużyć przypadek integer. –

-1

Funkcja binary_to_term i jej odpowiednik term_to_binary prawdopodobnie dobrze by Ci służyły.

+0

Nie w tym przypadku. Konwersja z 'binary_to_term' i' term_to_binary' w najlepszym wypadku zmieni łańcuch binarny na zwykłą listę/ciąg znaków. Nie zostanie uzyskana liczba zmiennoprzecinkowa ani liczba całkowita. Zobacz moją odpowiedź na sposób to zrobić. –

+2

@I DAĆ STRACONY PORADY: Sugerowałem użycie 'term_to_binary', aby uzyskać binarne w pierwszej kolejności. Potem konwersja z powrotem jest banalna. Oczywiście nadal może być całkowicie nierealne, jeśli OP nie będzie mieć kontroli nad tym, skąd pochodzą dane. – nmichaels

+0

To ma sens w tym kontekście. –

12

Jest to wzór, który używamy:

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.