2009-02-25 17 views
48

Lo so, le stringhe di Erlang deve essere evitato a tutti i costi ...convertire un intero in una stringa in Erlang

ma se non sto facendo questo, come faccio a produrre "5" da 5?

in particolare, c'è qualcosa come io: format ("~ p", [5]) che restituisce una stringa formattata invece di stampare su un flusso?

+1

Evitato a tutti i costi? Dove hai preso quell'idea? Ci sono alcuni problemi di prestazioni e altri fastidi, ma sono ancora un tipo di dati di base e la scelta predefinita per le stringhe. – cthulahoops

+1

Parlo con la lingua sulla guancia. Se credessi fermamente che non dovresti mai usarli, non avrei fatto questa domanda. D'altro canto, descriverli come un "tipo di dati di base" potrebbe essere un po 'lontano, a mio avviso. – collapsinghrung

+1

string in erlang è una lista. è il tipo di dati di base. lo stesso di binario o atomo. – Worker

risposta

10

Quanto segue non è probabilmente il modo più grazioso, ma funziona:

1> lists:flatten(io_lib:format("~p", [35365])). 
"35365" 

EDIT: ho trovato che la seguente funzione è disponibile in utile:

%% string_format/2 
%% Like io:format except it returns the evaluated string rather than write 
%% it to standard output. 
%% Parameters: 
%% 1. format string similar to that used by io:format. 
%% 2. list of values to supply to format string. 
%% Returns: 
%% Formatted string. 
string_format(Pattern, Values) -> 
    lists:flatten(io_lib:format(Pattern, Values)). 

EDIT 2 (in risposta ai commenti): la funzione di cui sopra è venuto da un piccolo programma che ho scritto qualche tempo fa per imparare Erlang. Ero alla ricerca di una funzione di stringa di formattazione e ho trovato il comportamento di io_lib:format/2 all'interno erl contro-intuitivo, ad esempio:

1> io_lib:format("2 + 2 = ~p", [2+2]). 
[50,32,43,32,50,32,61,32,"4"] 

A quel tempo, ero all'oscuro del comportamento 'auto-appiattimento' di dispositivi di output menzionati da @archaelus e ha concluso che il comportamento di cui sopra non era quello che volevo.

Questa sera sono tornato a questo programma e ho sostituito le chiamate alla funzione string_format in alto con io_lib:format. Gli unici problemi che ciò ha causato sono stati alcuni test EUnit falliti perché si aspettavano una stringa appiattita. Questi sono stati facilmente risolti.

Sono d'accordo con @gleber e @womble che l'uso di questa funzione è eccessivo per convertire un intero in una stringa. Se è tutto ciò che serve, utilizzare integer_to_list/1. BACIO!

+21

Non è assolutamente necessario utilizzare 'io_lib: format/2' per questa semplice operazione. 'integer_to_list/1' è sufficiente. – gleber

+2

Inoltre, appiattire l'iolist risultante è normalmente dispendioso. Gli zoccoli/porte/file/IoDevice si appiattiscono sull'output, quindi l'appiattimento è ridondante. – archaelus

+0

integer_to_list/1 è sufficiente per la domanda con il titolo, ma questo risponde in modo chiaro al mio "puoi produrre stringhe formattate con numeri interpolati" sottoquestione ... – collapsinghrung

131

C'è anche integer_to_list/1, che fa esattamente quello che vuoi, senza la bruttezza.

+0

Penso che tu intenda list_to_integer/1 e list_to_float/1 mentre sta cercando di passare da una stringa a un numero. Anche la documentazione per queste funzioni è "difficile da trovare" dato che sono entrambe parte del modulo Erlang e devi sapere di guardarti. –

+7

Sta cercando di convertire da 5 a "5". Quindi, integer to string. –

+3

integer_to_list/1 è giusto. – ErJab

4

Se si ha bisogno di occuparsi della rappresentazione delle stringhe dei float, è necessario considerare lo work che Bob Ippolito ha eseguito su mochinum.

25

una stringa è un elenco:

9> integer_to_list(123). 
"123" 
2

liste: concat ([numero]). funziona anche

Problemi correlati