RosettaCodeData/Task/Middle-three-digits/Elixir/middle-three-digits.elixir

31 lines
794 B
Plaintext

defmodule Middle do
def three(num) do
n = num |> abs |> to_string
case {n,String.length(n) > 2,even?(n)} do
{n, true, false} ->
cut(n)
{_, false, _} ->
raise "Number must have at least three digits"
{_, _, true} ->
raise "Number must have an odd number of digits"
end
end
defp even?(n), do: rem(String.length(n),2) == 0
defp cut(n), do: String.slice(n,(div(String.length(n),2) - 1),3)
end
valids = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345]
Enum.each(valids, fn n -> :io.format "~10w : ~s~n", [n, Middle.three(n)] end)
errors = [1, 2, -1, -10, 2002, -2002, 0]
Enum.each(errors, fn n ->
:io.format "~10w : ", [n]
try do
IO.puts Middle.three(n)
rescue
e -> IO.puts e.message
end
end)