Elixir检查字符串是否为整数

Mic*_*air 1 elixir

是否可以检查传入的字符串参数是否为整数?例如,我需要根据其id("12345")或external_id("eUv9wWzZ48bMZsuII6ivCle2NHgIEPoMLWC9ioDV")检索模型.这有可能实现吗?我试过is_integer但返回false,因为它不会尝试解析字符串.

def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) and is_integer(id) do
    ZB.Repo.get!(module, id)
  |> check(conn)
end
def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) do
  ZB.Repo.get_by!(module, external_id: id)
end
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 5

不,这不能在警卫中完成。您可以在警卫中调用的函数是有限的,并且不包括任何用于检查字符串是否仅包含数字的函数。

您可以改为Integer.parse/1在正文中使用:

def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) do
  case Integer.parse(id) do
    {_, ""} -> 
      ZB.Repo.get!(module, id) |> check(conn)
    
    _ -> 
      ZB.Repo.get_by!(module, external_id: id)
  end
end
Run Code Online (Sandbox Code Playgroud)


Ale*_*kin 5

这是一个XY问题,我相信你正试图以不正确的方式解决不存在的问题:)

根据我从输入中看到的内容,external_id应该是长度为40的字母数字字符串.此处的关键字是字母数字.也就是说,40次"1"可能是一个extenral_id.你知道吗?它完美解析Integer.parse/2:

iex|1 ? ["1"] |> List.duplicate(40) |> Enum.join |> Integer.parse
#? {1111111111111111111111111111111111111111, ""}
Run Code Online (Sandbox Code Playgroud)

也就是说,在这种情况下检查整数是无效的,因为它可能导致误报.

你真正需要做的是,尝试通过external_id可能基于它的长度或某事来获得记录,并且id如果没有成功则回退.此外,二进制文件的长度可能确实在保护中检查(隐式地,通过引入中间包装二进制⇒比特串.)

def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) do
  case ZB.Repo.get_by(module, external_id: id) do
    {:ok, record} -> record
    _ -> ZB.Repo.get!(module, id) |> check(conn)
  end
end
Run Code Online (Sandbox Code Playgroud)