2010-12-01 19 views
7

Ben ikili dizeleri yüzer ya:ERLANG - İkili dize tamsayı veya şeklinde

<<"5.7778345">> 

veya

<<"444555">> 
Ben bir şamandıra veya tamsayı olup olmayacağı elden önce bilmiyorum

.

Tamsayı olup olmadığını görmek için bir kontrol yapmayı denedim. İkili olduğu için çalışmıyor. İkiliyi listeye dönüştürmeyi denediniz ve ardından int veya float olup olmadığını kontrol ediniz. Bununla çok fazla başarı.

O

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

Herkes bunun nasıl iyi bir fikir var böyle

gibi bir işlev olması gerekiyor? bunu yapmak için

Tüm En

cevap

18

Hiçbir hızlı şekilde. şöyle bir şey yerine kullanın:

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. 

Bu

sonra, bir liste (string) için ikili dönüştürmek Bir tayin sığdırmak için çalışmalısınız. Bu yapılamadığında, bir tamsayı döndürürüz. Aksi halde, şamandırayı korur ve geri veririz.

+0

Muhtemelen list_to_float değil dize istiyorum: to_float –

+0

Aynı zamanda geçerli bir yaklaşım evet olurdu. Muhtemelen daha hızlı. string: to_float, avantajı olabilecek veya olmayabilecek daha fazla çöpü tolere edecektir. Cevabını bastım. –

+0

Çoğunlukla bunu önerdim çünkü << "123.456seven" >> geçerli sayılır ama << "123456seven" >>. Kasıtlı olarak çöp toleranslı versiyonu da tamsayı davayı halledebilir. –

-1

işlevi ve onun karşılığı term_to_binary muhtemelen size iyi hizmet verecektir.

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. 
+0

Bu durumda değil. 'Binary_to_term' ve' term_to_binary' ile dönüştürme işlemi, ikili dizgiyi normal bir liste/dizgeye dönüştürecektir. Float veya tam sayı elde edilmeyecektir. Bunu yapmanın bir yolu için cevabımı görün. –

+2

@I VERİLEBİLİR TAVSİYE TAVSİYE: Ben ilk etapta ikili almak için 'term_to_binary' kullanmanızı öneririm. Sonra geri dönüş önemsizdir. Elbette OP'nin verinin nereden geldiğini kontrol edememesi hâlâ tamamen gerçekçi olmayabilir. – nmichaels

+0

Bu bağlamda mantıklı. –

12

Bu

kullandığımız kalıptır.