将Elixirstring转换为整型或浮点型
我需要将string转换为浮点值或整数。 没有这样的方法,
string_to_integer
检查Integer.parse/1
和Float.parse/1
。
除了Josébuild议的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
进行其他转换。
感谢这个页面上的人们,这里简单的回答一下:
{intVal, _} = Integer.parse(val)
你可以将它转换为char_list,然后使用Erlang to_integer/1
或to_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]