2010-12-01 16 views
7

tengo cadenas binarias en la forma de:ERLANG - cadena binaria de número entero o flotan

<<"5.7778345">> 

o

<<"444555">> 

No sé de antemano si va a ser un flotador o entero .

He intentado hacer una comprobación para ver si se trata de un número entero. No funciona, ya que es binario. Y traté de convertir el binario a la lista y luego compruebo si es int o float. No hay mucho éxito con eso.

Es necesario que haya una función como

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

Alguien tiene una buena idea de cómo hacer esto?

Todo lo mejor

Respuesta

18

No hay forma rápida de hacerlo. Usar algo como esto en su lugar:

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. 

Esto debería convertir el binario a una lista (cadena), a continuación, tratar de encajar en un flotador. Cuando eso no se puede hacer, devolvemos un número entero. De lo contrario, mantenemos el flotador y lo devolvemos.

+0

es probable que desee list_to_float no cadena: to_float. –

+0

También sería un enfoque válido sí. Probablemente más rápido. string: to_float tolerará más basura, lo que podría o no ser una ventaja. He votado a favor su respuesta. –

+0

Lo sugerí principalmente porque << "123.456seven" >> se consideraría válido pero no << "123456seven" >>. Una versión intencionalmente tolerante a la basura también podría manejar el caso entero. –

-1

La función binary_to_term y su contraparte term_to_binary probablemente le servirían bien.

+0

No en este caso. La conversión con 'binary_to_term' y' term_to_binary' en el mejor de los casos cambiará la cadena binaria a una lista/cadena normal. No se obtendrá flotante o entero. Ver mi respuesta para una forma de hacerlo. –

+2

@YO DOY CONSEJOS TERRIBLES: En primer lugar, sugería usar 'term_to_binary' para obtener el binario. Entonces la conversión de vuelta es trivial. Por supuesto, aún podría ser completamente irreal si el OP no tiene control sobre el origen de los datos. – nmichaels

+0

Eso tiene sentido, en ese contexto. –

12

Este es el modelo que usamos:

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. 
Cuestiones relacionadas