首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查字符串是否为保护中的整数

检查字符串是否为保护中的整数
EN

Stack Overflow用户
提问于 2018-02-08 16:34:19
回答 2查看 7.9K关注 0票数 3

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-08 18:30:20

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

根据我从您的输入中看到的,external_id应该是长度为40的字母数字字符串。这里的关键字是字母数字。也就是说,40倍的"1“可能是external_id。你知道吗?它被Integer.parse/2完美地解析

代码语言:javascript
复制
iex|1 ▶ ["1"] |> List.duplicate(40) |> Enum.join |> Integer.parse
#⇒ {1111111111111111111111111111111111111111, ""}

也就是说,检查整数在这个上下文中是无效的,因为它可能导致假阳性。

您实际上需要做的是,尝试通过external_id获取记录,可能是基于它的长度或其他什么,如果不成功,则返回到id。此外,二进制文件的长度确实可以在保护中签入(隐式地,通过引入中间包装二进制⇒位字符串)。

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2018-02-08 16:40:05

不,这不能用警卫来做。您可以在保护中调用的函数是有限的,并且不包含任何函数来检查字符串是否只包含数字。

您可以在主体中使用Integer.parse/1

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48690396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档