Обратите внимание, что это вернет кортеж (в случае успеха), а не целое число напрямую. Если вы хотите это сделать, посмотрите ответ @Szymon JeżString.to_integer/1
6
Есть ли причина использовать Integer.parse/1over String.to_integer/1?
Ян Воган
10
@IanVaughan Integer.parse/1возвращает :errorатом в случае неудачи . String.to_integer/1бросает (FunctionClauseError).
Джонатан Сойфер
52
В дополнении к Integer.parse/1и Float.parse/1функциям , которые Хосе предложенных вы можете также проверить String.to_integer/1и String.to_float/1.
Подсказка: Смотрите также to_atom/1, to_char_list/1, to_existing_atom/1для других преобразований.
Это вызовет ошибку, если val не является целым числом. Я добавил к результату случай, чтобы убедиться, что преобразование прошло успешно. Второе предложение может быть общим для catch: error или непустой второй строки, поскольку вам не важно, было ли введено «x3» или «3x».
Sinc,
14
Есть 4 функции для создания числа из строки
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerработает хорошо, но String.to_floatсложнее:
As String.to_floatможет обрабатывать только хорошо отформатированные числа с плавающей запятой, например:, 1.0not 1(целое число). Это было задокументировано в String.to_floatдокументации пользователя
Возвращает число с плавающей запятой, текстовое представление которого является строкой.
строка должна быть строковым представлением числа с плавающей запятой, включая десятичную точку. Для синтаксического анализа строки без десятичной точки как числа с плавающей запятой следует использовать Float.parse / 1. В противном случае возникнет ошибка ArgumentError.
Но Float.parseвозвращает кортеж из двух элементов, а не то число, которое вы хотите, поэтому помещать его в конвейер не "круто":
Как использовать в функциях? Мое лучшее решение - это то, fn q -> {v, _} = Float.parse(q); v endчто мне не нравится. Мне нравится использовать его Enum.map, например, list |> Enum.map(&String.to_float/1)но string.to_float не работает для целых чисел?
Я получил эту ошибку: ** (UndefinedFunctionError) функция Decimal.new/1 не определена (модуль Decimal недоступен)
Daniel Cukier
4
Проблема с использованием Integer.parse/1заключается в том, что он будет анализировать любую нечисловую часть строки, пока она находится в конце строки. Например:
Если вы хотите преобразовать строку в любой числовой тип внутри строки и удалить все другие символы, это, вероятно, излишне, но вернет float, если это float или int, если это int или nil, если строка не содержит числовой тип.
String.to_integer/1
Integer.parse/1
overString.to_integer/1
?Integer.parse/1
возвращает:error
атом в случае неудачи .String.to_integer/1
бросает(FunctionClauseError)
.В дополнении к
Integer.parse/1
иFloat.parse/1
функциям , которые Хосе предложенных вы можете также проверитьString.to_integer/1
иString.to_float/1
.Подсказка: Смотрите также
to_atom/1
,to_char_list/1
,to_existing_atom/1
для других преобразований.источник
Спасибо, ребята на этой странице, просто упрощаю ответ здесь:
поскольку он подтверждает, что была проанализирована вся строка (а не только префикс).
источник
Есть 4 функции для создания числа из строки
String.to_integer
работает хорошо, ноString.to_float
сложнее:As
String.to_float
может обрабатывать только хорошо отформатированные числа с плавающей запятой, например:,1.0
not1
(целое число). Это было задокументировано вString.to_float
документации пользователяНо
Float.parse
возвращает кортеж из двух элементов, а не то число, которое вы хотите, поэтому помещать его в конвейер не "круто":Использование
elem
для получения первого элемента из кортежа делает его короче и слаще:источник
Вы можете преобразовать его в char_list, а затем использовать Erlang
to_integer/1
илиto_float/1
.Например
источник
fn q -> {v, _} = Float.parse(q); v end
что мне не нравится. Мне нравится использовать егоEnum.map
, например,list |> Enum.map(&String.to_float/1)
но string.to_float не работает для целых чисел?источник
Проблема с использованием
Integer.parse/1
заключается в том, что он будет анализировать любую нечисловую часть строки, пока она находится в конце строки. Например:Аналогично
String.to_integer/1
имеет следующие результаты:Вместо этого сначала проверьте строку.
Регулярное выражение может быть проще (например
^[0-9]*$
) в зависимости от вашего варианта использования.источник
Если вы хотите преобразовать строку в любой числовой тип внутри строки и удалить все другие символы, это, вероятно, излишне, но вернет float, если это float или int, если это int или nil, если строка не содержит числовой тип.
источник