将Elixir字符串转换为整数或浮点数

Lah*_*iru 81 elixir

我需要将字符串转换为浮点值或整数.没有方法,如,

string_to_integer
Run Code Online (Sandbox Code Playgroud)

Jos*_*lim 135

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

  • 请注意,这将返回一个元组(如果成功),而不是直接返回整数.如果你想这样做,请参阅@SzymonJeż回答`String.to_integer/1` (30认同)
  • @IanVaughan`Integger.parse/1`如果不成功则返回`:error`原子.`String.to_integer/1`抛出一个`(FunctionClauseError)`. (10认同)
  • 有没有理由在`String.to_integer/1`上使用`Integer.parse/1`? (5认同)

Szy*_*Jeż 48

除了José建议您Integer.parse/1和其他Float.parse/1功能之外,您还可以查看String.to_integer/1String.to_float/1.

提示:另请参见to_atom/1,to_char_list/1,to_existing_atom/1对于其他转换.


Roo*_*ahi 24

感谢此页面上的人们,只需简化答案:

{intVal, ""} = Integer.parse(val)
Run Code Online (Sandbox Code Playgroud)

感谢@dimagog的评论


HVN*_*ing 11

有4个函数可以从字符串创建数字

  • 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
Run Code Online (Sandbox Code Playgroud)

因为String.to_float只能处理格式良好的浮点数,例如:1.0,而不是1(整数).这是中记录String.to_float的文档

返回其文本表示为字符串的float.

string必须是包含小数点的float的字符串表示形式.为了解析没有小数点的字符串作为浮点数,应该使用Float.parse/1.否则,将引发ArgumentError.

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

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]
Run Code Online (Sandbox Code Playgroud)

使用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]
Run Code Online (Sandbox Code Playgroud)


Jon*_*nas 10

您可以将其转换为char_list,然后使用Erlang to_integer/1to_float/1.

例如

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

iex> myInt
23
Run Code Online (Sandbox Code Playgroud)


kan*_*kyu 6

Decimal.new("1") |> Decimal.to_integer
Decimal.new("1.0") |> Decimal.to_float
Run Code Online (Sandbox Code Playgroud)

  • 我收到此错误: ** (UndefinedFunctionError) 函数 Decimal.new/1 未定义(模块 Decimal 不可用) (3认同)

小智 5

使用的问题Integer.parse/1是,只要字符串位于尾部,它就会解析字符串的任何非数字部分。例如:

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"}
Run Code Online (Sandbox Code Playgroud)

同样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")
Run Code Online (Sandbox Code Playgroud)

相反,首先验证字符串。

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
Run Code Online (Sandbox Code Playgroud)

^[0-9]*$根据您的用例,正则表达式可能会更简单(例如)。