2016-08-02 65 views
2

如果我有一个管道是这样的:药剂:防范参数错误

"1" |> String.to_integer 

我怎样才能防止它,如果字符串是空的(不为零)?

"" |> String.to_integer 
** (ArgumentError) argument error 
:erlang.binary_to_integer("") 
+0

在哪里使用这条管道? – TheAnh

+0

那是那里的控制台,但它在Phoenix模块中。 –

回答

4

一切都取决于上下文。例如,您可以使用默认值并在您的私人功能中使用它。

defp convert_to_integer(my_string \\ 0) # if 0 is appropriate default value 
    String.to_integer(my_string) 
end 

当然还有一个更好的方法 - Integer.parse,返回有效的元组,如果一切正常,并:error如果有什么问题。只需将它与condcase结合。

defp convert_to_integer(my_string) 
    result = Integer.parse(my_string) 

    case result do 
    {number, _} -> number 
    :error -> "it didn't work" # or anything  
    end 
end 
+0

这些都很棒,非常感谢。 –

+1

请注意,第二个片段将成功解析整数,然后是其他任何内容,例如'convert_to_integer(“123abc”)#=> 123'。 – Dogbert

1

尝试模式匹配警惕这一点:

def to_integer(string) when byte_size(string) == 0 do 
    # do_something_with_empty_string 
    IO.puts "empty" 
end 

def to_integer(string) do 
    # handle your case here 
    String.to_integer(string) 
end 

IEX:

iex(9)> Test.to_integer("") 
empty 
:ok 
iex(10)> Test.to_integer("2") 
2 
+0

感谢您的提示。我忘了你可以覆盖Elixir的功能。 –

+2

'当byte_size(string)== 0'可以是'to_integer(“”)'时,to_integer(string)。 – Dogbert