2009-02-25 15 views
48

lo sé, cadenas de Erlang se debe evitar a toda costa ...convertir un entero a una cadena en Erlang

pero si yo no estoy haciendo eso, ¿cómo produzco "5" de 5?

, en particular, ¿hay algo como io: formato ("~ p", [5]) que devolvería una cadena con formato en lugar de imprimir a una corriente?

+1

¿Evitado a toda costa? ¿De dónde sacaste esa idea? Existen algunos problemas de rendimiento y otras molestias, pero siguen siendo un tipo de datos básicos y la opción predeterminada para las cadenas. – cthulahoops

+1

Hablo con la lengua en la mejilla. Si creía firmemente que nunca deberías usarlos, no habría hecho esta pregunta. Por otro lado, describirlos como un "tipo de datos básicos" podría estar estirando las cosas un poco, en mi opinión. – collapsinghrung

+1

cadena en erlang es una lista. es el tipo de datos básicos. lo mismo que binario o átomo. – Worker

Respuesta

10

La siguiente no es probablemente la manera más ordenada, pero funciona:

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

EDIT: He encontrado que la siguiente función resulta muy útil:

%% 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 (en respuesta a los comentarios): la función anterior proviene de un pequeño programa que escribí hace un tiempo para aprender Erlang. Yo estaba buscando una función de cadena de formato y encontré el comportamiento de io_lib:format/2 dentro erl contrario a la intuición, por ejemplo:

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

En ese momento, no era consciente de la 'auto-aplanamiento' comportamiento de los dispositivos de salida mencionado por @archaelus y así concluyó que el comportamiento anterior no era lo que yo quería.

Esta tarde, volví a este programa y reemplacé las llamadas a la función string_format anterior con io_lib:format. Los únicos problemas que esto causó fueron unas pocas pruebas EUnit que fallaron porque esperaban una cadena aplanada. Estos fueron arreglados fácilmente.

Estoy de acuerdo con @gleber y @womble que el uso de esta función es un exceso para convertir un entero a una cadena. Si eso es todo lo que necesita, use integer_to_list/1. ¡BESO!

+21

No hay absolutamente ninguna necesidad de usar 'io_lib: format/2' para esta tarea simple. 'integer_to_list/1' es suficiente. – gleber

+2

Además, aplanar el iolist resultante suele ser un desperdicio. Sockets/Ports/Files/IoDevices se aplanan en la salida, por lo que el aplanamiento es redundante. – archaelus

+0

integer_to_list/1 es suficiente para la pregunta principal, pero esto responde claramente mi pregunta "¿puedes producir cadenas formateadas con números interpolados?" – collapsinghrung

131

También hay integer_to_list/1, que hace exactamente lo que quiere, sin la fealdad.

+0

Creo que te refieres a list_to_integer/1 y list_to_float/1 ya que está tratando de pasar de una cadena a un número. También la documentación para estas funciones es "difícil de encontrar", ya que ambas son parte del módulo de Erlang y debe saber para buscar allí. –

+7

Está tratando de convertir 5 a "5". Por lo tanto, entero para encadenar. –

+3

integer_to_list/1 es correcto. – ErJab

4

Como un aparte si alguna vez tiene que tratar con la representación de cadena de flotadores, debe mirar el work que Bob Ippolito ha hecho en mochinum.

25

Una cadena es una lista:

9> integer_to_list(123). 
"123" 
2

listas: concat ([número]). también funciona

Cuestiones relacionadas