Вопрос по erlang, string – списки: CONCAT ([Number]). тоже работает.

53

ю, что следует избегать строк Erlang любой ценой ...

но если я не делаю этого, как я получу «5» из 5?

в частности, есть ли что-то вроде io: format ("~ p", [5]), которое возвращало бы отформатированную строку вместо печати в поток?

строка в erlang - это список. это основной тип данных. такой же как бинарный или атомный. Worker
Избегать любой ценой? Откуда у вас эта идея? Есть некоторые проблемы с производительностью и другие неприятности, но они по-прежнему являются основным типом данных и выбором по умолчанию для строк. cthulahoops
Я говорю с языком в щеку. Если бы я твердо верил, что вы никогда не должны их использовать, я бы не задавал этот вопрос. С другой стороны, описывать их как «основной тип данных» может, на мой взгляд, немного растянуть. collapsinghrung

Ваш Ответ

4   ответа
142

integer_to_list/1, который делает именно то, что вы хотите, без уродства.

integer_to_list / 1 правильно. ErJab
@ Гордон: название вопроса "конвертировать целое число в строку" ... womble
Он пытается конвертировать 5 в «5». Таким образом, целое число в строку. Adam Lindberg
Я думаю, что вы имеете в виду list_to_integer / 1 и list_to_float / 1, поскольку он пытается перейти от строки к числу. Кроме того, документацию для этих функций «сложно найти», так как они оба являются частью модуля Erlang, и вам нужно знать, чтобы посмотреть там. Gordon Guthrie
списки строк в Эрланге Vukasin Toroman
14

Следующее, вероятно, не самый удачный способ, но это работает:

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

РЕДАКТИРОВАТЬ: я обнаружил, что полезна следующая функция:

%% 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)).

РЕДАКТИРОВАТЬ 2 (в ответ на комментарии): вышеупомянутая функция пришла из небольшой программы, которую я недавно написал для изучения Erlang. Я искал функцию форматирования строки и обнаружил поведениеio_lib:format/2 вerl нелогично, например:

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

В то время я не знал о «автоматическом сглаживании» поведения устройств вывода, упомянутых @archaelus, и поэтому пришел к выводу, что вышеупомянутое поведение было не тем, что я хотел.

Этим вечером я вернулся к этой программе и заменил звонки наstring_format функция выше сio_lib:format, Единственные проблемы, которые это вызвало, были несколько тестов EUnit, которые потерпели неудачу, потому что они ожидали сплющенную строку. Они были легко исправлены.

Я согласен с @gleber и @womble, что использование этой функции излишне для преобразования целого числа в строку. Если это все, что вам нужно, используйтеinteger_to_list/1, ПОЦЕЛУЙ!

integer_to_list / 1 достаточно для заголовка вопроса, но это точно ответит на мой вопрос: «Можете ли вы создать отформатированные строки с интерполированными числами» ... collapsinghrung
Жаль, что это выбранный ответ, потому чтоУомблэто правильный ответ. Rodrigue
Это работает для поплавков (не оригинальный вопрос, но это то, что мне было нужно), так как встроенныйfloat_to_list выплевывает значение в научной записи (некрасиво). Grant
Кроме того, выравнивание получающегося Iolist обычно расточительно. Сокеты / порты / файлы / IoDevices все сглаживаются на выходе, поэтому выравнивание самостоятельно является излишним. archaelus
Там абсолютно нет необходимости использоватьio_lib:format/2 для этой простой задачи.integer_to_list/1 достаточно. gleber
27

Строка - это список:

9> integer_to_list(123).  
"123"
4

если вам когда-либо понадобится иметь дело со строковым представлением чисел с плавающей точкой, вы должны взглянуть наработай что Боб Ипполито сделал наmochinum.

Похожие вопросы