2010-12-01 16 views
7

ho stringhe binarie sotto forma di uno:Erlang - stringa binaria per intero o galleggiare

<<"5.7778345">> 

o

<<"444555">> 

Non so di prima mano se sarà un galleggiante o un numero intero .

Ho provato a fare un controllo per vedere se è un numero intero. Non funziona poiché è binario. E provato a convertire i binari in lista, quindi controlla se int o float. Non ha molto successo con quello.

ha bisogno di essere una funzione come

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

Qualcuno ha una buona idea di come fare questo?

Tutti i migliori

risposta

18

Nessun modo rapido per farlo. Usa qualcosa come questo, invece:

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. 

Questo dovrebbe convertire il binario a una lista (stringa), quindi provare a inserirla in un galleggiante. Quando ciò non può essere fatto, restituiamo un intero. Altrimenti, manteniamo il float e lo restituiamo.

+0

probabilmente avrete bisogno list_to_float non stringa: to_float. –

+0

Sarebbe anche un approccio valido sì. Probabilmente più veloce. stringa: to_float tollererà più garbage, che potrebbe o non potrebbe essere un vantaggio. Ho upvoted la tua risposta. –

+0

L'ho suggerito principalmente perché << "123.456seven" >> sarebbe considerato valido ma non << "123456seven" >>. Una versione volutamente tollerante ai rifiuti sarebbe in grado di gestire anche il caso intero. –

-1

La funzione binary_to_term e la sua controparte term_to_binary probabilmente vi saranno utili.

+0

Non in questo caso. La conversione con 'binary_to_term' e' term_to_binary' cambierà al meglio la stringa binaria in una lista/stringa regolare. Nessun float o intero sarà ottenuto. Vedi la mia risposta per un modo per farlo. –

+2

@I DICO CONSIGLIO TERRIBILE: stavo suggerendo di usare 'term_to_binary' per ottenere il binario in primo luogo. Quindi la conversione è banale. Certamente, potrebbe ancora essere completamente irrealistico se l'OP non ha il controllo su da dove provengono i dati. – nmichaels

+0

Questo ha senso, in quel contesto. –

12

Questo è il modello che usiamo:

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. 
Problemi correlati