2010-12-01 2 views
7

J'ai des chaînes binaires sous la forme soit:ERLANG - chaîne binaire entière ou flottante

<<"5.7778345">> 

ou

<<"444555">> 

Je ne sais pas au préalable si ce sera un flotteur ou entier .

J'ai essayé de faire une vérification pour voir si c'est un nombre entier. Ne fonctionne pas car il est binaire. Et essayé de convertir binaire en liste puis vérifiez si int ou float. Pas beaucoup de succès avec ça.

Il doit être une fonction telle que

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

Quelqu'un at-il une bonne idée de la façon de le faire?

Tout le meilleur

Répondre

18

Aucun moyen rapide de le faire. Utilisez quelque chose comme ceci:

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. 

Cela devrait convertir le fichier binaire à une liste (string), puis essayer de l'adapter à un flotteur. Quand cela ne peut pas être fait, nous retournons un entier. Sinon, nous gardons le flotteur et le restituons.

+0

Vous voulez probablement pas list_to_float chaîne: to_float. –

+0

Ce serait aussi une approche valide oui. Probablement plus rapide. string: to_float tolèrera plus de déchets, ce qui pourrait ou non être un avantage. J'ai upvoted votre réponse. –

+0

Je l'ai surtout suggéré car << "123.456seven" >> serait considéré comme valide mais pas << "123456seven" >>. Une version intentionnellement tolérante aux ordures serait également capable de gérer le cas de l'entier. –

-1

La fonction binary_to_term et sa contrepartie term_to_binary vous seront probablement utiles.

+0

Pas dans ce cas. La conversion avec 'binary_to_term' et' term_to_binary' changera au mieux la chaîne binaire en une liste/chaîne régulière. Aucun flottant ou nombre entier ne sera obtenu. Voir ma réponse pour un moyen de le faire. –

+2

@I DONNER UN CONSEIL TERRIBLE: Je suggérais d'utiliser 'term_to_binary' pour obtenir le binaire en premier lieu. Ensuite, la conversion est triviale. Bien sûr, il pourrait encore être complètement irréaliste si le PO n'a pas de contrôle sur l'origine des données. – nmichaels

+0

Cela a du sens, dans ce contexte. –

12

C'est le modèle que nous utilisons:

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. 
Questions connexes