2009-02-25 3 views
48

Ich weiß, sollte Erlang Strings mit allen Mitteln ...konvertieren eine ganze Zahl in eine Zeichenfolge in Erlang

vermieden werden, aber wenn ich tue das nicht, wie ich „5“ von 5 produzieren?

insbesondere gibt es etwas wie io: format ("~ p", [5]), das eine formatierte Zeichenkette zurückgeben würde, anstatt in einen Stream zu drucken?

+1

Um jeden Preis vermieden? Woher hast du diese Idee? Es gibt einige Leistungsbedenken und andere Belästigungen, aber sie sind immer noch ein Kerndatentyp und die Standardauswahl für Zeichenfolgen. – cthulahoops

+1

Ich spreche mit der Zunge. Wenn ich fest daran geglaubt hätte, dass Sie sie niemals benutzen sollten, hätte ich diese Frage nicht gestellt. Auf der anderen Seite könnte es meiner Meinung nach ein bisschen weit gehen, sie als "Core Data Type" zu bezeichnen. – collapsinghrung

+1

string in erlang ist eine Liste. Dies ist der Kerndatentyp. das gleiche wie binär oder atom. – Worker

Antwort

10

Das folgende ist wahrscheinlich nicht der sauberste Weg, aber es funktioniert:

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

EDIT: Ich habe festgestellt, dass die folgende Funktion in nützlich kommt:

%% 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 (als Reaktion auf Kommentare): Die obige Funktion kam von einem kleinen Programm, das ich vor einiger Zeit geschrieben habe, um Erlang zu lernen. Ich war für eine String-Formatierung Funktion suchen und das Verhalten von io_lib:format/2 innerhalb erl kontraintuitiv gefunden, zum Beispiel:

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

Zu der Zeit weiß mich nicht, das "auto-Abflachen Verhaltens von Ausgabegeräten erwähnt von @archaelus und kam zu dem Schluss, dass das oben genannte Verhalten nicht das war, was ich wollte.

Heute Abend ging ich zurück zu diesem Programm und ersetzte Anrufe auf die string_format Funktion oben mit io_lib:format. Die einzigen Probleme, die dies verursachten, waren einige EUnit-Tests, die fehlgeschlagen waren, weil sie eine abgeflachte Zeichenfolge erwarteten. Diese waren leicht zu reparieren.

Ich stimme @gleber und @womble zu, dass die Verwendung dieser Funktion Overkill zum Konvertieren einer Ganzzahl in eine Zeichenfolge ist. Wenn das alles ist, was Sie brauchen, verwenden Sie integer_to_list/1. KUSS!

+21

Es ist absolut nicht notwendig, 'io_lib: format/2' für diese einfache Aufgabe zu verwenden. 'integer_to_list/1' ist genug. – gleber

+2

Auch das Abflachen des resultierenden Iolists ist normalerweise verschwenderisch. Sockets/Ports/Files/IoDevices flacht alles am Ausgang ab, so dass Sie sich selbst überflüssig machen müssen. – archaelus

+0

integer_to_list/1 ist genug für die Überschrift Frage, aber das beantwortet meine "können Sie formatierte Strings mit interpolierten Zahlen produzieren" subquestion ... – collapsinghrung

131

Es gibt auch integer_to_list/1, die genau das tut, was Sie wollen, ohne die Hässlichkeit.

+0

Ich denke, du meinst list_to_integer/1 und list_to_float/1, während er versucht, von einer Zeichenkette zu einer Zahl zu wechseln. Auch die Dokumentation für diese Funktionen ist "schwer zu finden", da sie beide Teil des Erlang-Moduls sind und Sie wissen müssen, um dort zu suchen. –

+7

Er versucht, 5 in "5" zu konvertieren. Also, Ganzzahl zu Zeichenkette. –

+3

integer_to_list/1 ist richtig. – ErJab

4

Als eine beiseite, wenn Sie jemals mit der String-Darstellung der Schwimmer beschäftigen müssen, sollten Sie sich die work, die Bob Ippolito auf mochinum getan hat.

25

Ein String ist eine Liste:

9> integer_to_list(123). 
"123" 
2

Listen: concat ([Nummer]). funktioniert auch.