2011-06-28 8 views
9

En erlang, quiero formatear una cadena con enteros y quiero que se aplana el resultado. Pero entiendo esto:¿Cómo formatear una cadena plana con números enteros en erlang?

io_lib:format("sdfsdf ~B", [12312]).     
[115,100,102,115,100,102,32,"12312"] 

Puedo obtener el resultado deseado utilizando el siguiente código, pero realmente no es elegante.

lists:flatten(io_lib:format("sdfsdf ~B", [12312])). 
"sdfsdf 12312" 

¿Hay un mejor formato de cadenas con números enteros en ellas, para que sean planas? Idealmente, ¿usando solo una función?

Respuesta

6

Aplanará una lista usando lists:flatten/1 como lo ha hecho en su ejemplo.

Si usted puede aceptar un binario, list_to_binary/1 es bastante eficiente:

1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])). 
<<"sdfsdf 12312">> 

Sin embargo, la pregunta por qué necesita una lista plana en el primer lugar. Si solo son cosméticos, no lo necesitas. io:format/1,2,3 y la mayoría de las otras funciones del puerto (gen_tcp etc) Aceptar por lo que llamó listas IO profundas (listas anidadas con caracteres y binarios):

2> io:format([115,100,102,115,100,102,32,"12312"]). 
sdfsdf 12312ok 
2

hay una razón eficiencia que io_lib Formato vuelve listas de profundidad. Básicamente, guarda una llamada a listas: aplastar.

Pregúntate por qué quieres la lista aplanada. Si va a imprimir la lista o enviarla a un puerto o escribirla en un archivo, todas esas operaciones manejan listas profundas.

Si realmente necesita una lista aplanada por algún motivo, simplemente aplánela. O puede crear su propio formato my_io_lib: que devuelve listas planas si lo considera importante.

(Si sólo desea para aplanar la lista para depurar razones entonces o bien imprimir sus cuerdas con ~ s, o crear un acoplador en un módulo Erlang llamado user_default Algo como esto:.

-module(user_default). 
-compile(export_all). 
%% either this: 
fl(String) -> 
    lists:flatten(String). 
%% or this: 
pp(String) -> 
    io:format("~s~n", [String]). 

entonces se puede use fl/1 e imprima/1 en el shell de Erlang (siempre que user_default.beam esté en su ruta, por supuesto).)

Cuestiones relacionadas