2011-01-23 12 views
6

Ho un binario M tale che 34 = sarà sempre presente e il resto può variare tra qualsiasi numero di cifre ma sarà sempre un numero intero.Da binario a intero -> Erlang

M = [<<"34=21">>] 

Quando eseguo questo comando ottengo una risposta del tipo

hd([X || <<"34=", X/binary >> <- M]) 

Answer -> <<"21">> 

come posso ottenere questo per essere un numero intero con il più cura per renderlo il più efficiente possibile?

risposta

20
[<<"34=",X/binary>>] = M, 
list_to_integer(binary_to_list(X)). 

che produce il numero intero 21

+0

È questo il modo più efficace per farlo? Qualche idea sul perché non ci sia una funzione per passare direttamente dal binario all'intero? – BAR

+1

perché un binario è per impostazione predefinita un insieme di numeri interi. Quello che hai fatto qui è usato la rappresentazione di caratteri interi che Erlang sa interpretare come una stringa. Fondamentalmente un BIF per farlo sarebbe "binary_to_list_to_integer" perché "<> = <<1,2,3>>' ti darebbe già solo '1' ed è praticamente una conversione da binario a intero, suppongo. –

1

Una rappresentazione stringa di un numero può essere convertito da N-48. Per i numeri a più cifre si può piegare sopra il binario, moltiplicando per il potere della posizione della cifra:

-spec to_int(binary()) -> integer(). 
to_int(Bin) when is_binary(Bin) -> 
    to_int(Bin, {size(Bin), 0}). 

to_int(_, {0, Acc}) -> 
    erlang:trunc(Acc); 
to_int(<<N/integer, Tail/binary>>, {Pos, Acc}) when N >= 48, N =< 57 -> 
    to_int(Tail, {Pos-1, Acc + ((N-48) * math:pow(10, Pos-1))}). 

Le prestazioni di questo è di circa 100 volte più lento utilizzando l'opzione list_to_integer(binary_to_list(X)).

17

As of R16B, il BIF binary_to_integer/1 può essere utilizzato:

OTP-10300

aggiunto quattro nuove BIFS, erlang:binary_to_integer/1,2, erlang:integer_to_binary/1, erlang:binary_to_float/1 e erlang:float_to_binary/1,2. Queste bif funzionano in modo simile a come funzionano le rispettive controparti elenco, eccetto che funzionano sui file binari . Nella maggior parte dei casi, la conversione da e verso i binari è più veloce rispetto alla conversione da e verso gli elenchi.

Queste bif vengono importate automaticamente nei file di origine di erlang e possono quindi essere utilizzate senza il prefisso di erlang .

In modo che sarebbe simile:

[<<"34=",X/binary>>] = M, 
binary_to_integer(X). 
+0

finalmente lo fanno .. – BAR