2016-08-02 58 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