将Elixirstring转换为整型或浮点型

我需要将string转换为浮点值或整数。 没有这样的方法,

string_to_integer 

检查Integer.parse/1Float.parse/1

除了Josébuild议的Integer.parse/1Float.parse/1函数之外,您还可以检查String.to_integer/1String.to_float/1

提示:另请参阅to_atom/1to_char_list/1to_existing_atom/1进行其他转换。

感谢这个页面上的人们,这里简单的回答一下:

 {intVal, _} = Integer.parse(val) 

你可以将它转换为char_list,然后使用Erlang to_integer/1to_float/1

例如

 iex> {myInt, _} = :string.to_integer(to_char_list("23")) {23, []} iex> myInt 23 

如果要将string转换为string中的任何数字types并除去所有其他字符,则可能是过度杀毒,但如果其为float或int,则返回float;如果该string不包含,则返回int一个数字types。

 @spec string_to_numeric(binary()) :: float() | number() | nil def string_to_numeric(val) when is_binary(val), do: _string_to_numeric(Regex.replace(~r{[^\d\.]}, val, "")) defp _string_to_numeric(val) when is_binary(val), do: _string_to_numeric(Integer.parse(val), val) defp _string_to_numeric(:error, _val), do: nil defp _string_to_numeric({num, ""}, _val), do: num defp _string_to_numeric({num, ".0"}, _val), do: num defp _string_to_numeric({_num, _str}, val), do: elem(Float.parse(val), 0) 

使用Integer.parse/1的问题是只要它在尾端就会parsingstring的任何非数字部分。 例如:

 Integer.parse("01") # {1, ""} Integer.parse("01.2") # {1, ".2"} Integer.parse("0-1") # {0, "-1"} Integer.parse("-01") # {-1, ""} Integer.parse("x-01") # :error Integer.parse("0-1x") # {0, "-1x"} 

类似的String.to_integer/1有以下结果:

 String.to_integer("01") # 1 String.to_integer("01.2") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2") String.to_integer("0-1") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2") String.to_integer("-01") # -1 String.to_integer("x-01") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2") String.to_integer("0-1x") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2") 

相反,首先validationstring。

 re = Regex.compile!("^[+-]?[0-9]*\.?[0-9]*$") Regex.match?(re, "01") # true Regex.match?(re, "01.2") # true Regex.match?(re, "0-1") # false Regex.match?(re, "-01") # true Regex.match?(re, "x-01") # false Regex.match?(re, "0-1x") # false 

正则expression式可能更简单(例如^[0-9]*$ ),具体取决于您的用例。

有4个函数可以从string中创build数字

  • String.to_integer,String.to_float
  • Integer.parse,Float.parse

String.to_integer很好地工作,但String.to_float更难:

 iex()> "1 2 3 10 100" |> String.split |> Enum.map(&String.to_integer/1) [1, 2, 3, 10, 100] iex()> "1.0 1 3 10 100" |> String.split |> Enum.map(&String.to_float/1) ** (ArgumentError) argument error :erlang.binary_to_float("1") (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2 (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2 

由于String.to_float只能处理格式良好的浮点数,例如: 1.0 ,而不是1 (整数)。 这是logging在String.to_float的文档

返回文本表示forms为string的浮点数。

string必须是包含小数点的浮点数的string表示forms。 为了parsing一个没有小数点的string作为float,那么应该使用Float.parse / 1。 否则,会引发一个ArgumentError。

但是Float.parse返回2个元素的元组,而不是你想要的数字,所以把它放到pipe道中并不“酷”:

 iex()> "1.0 1 3 10 100" |> String.split \ |> Enum.map(fn n -> {v, _} = Float.parse(n); v end) [1.0, 1.0, 3.0, 10.0, 100.0] 

使用elem从元组中获得第一个元素使其更短更甜美:

 iex()> "1.0 1 3 10 100" |> String.split \ |> Enum.map(fn n -> Float.parse(n) |> elem(0) end) [1.0, 1.0, 3.0, 10.0, 100.0]