Trying to reverse an integer regardless of its sign I wrote the following algorithm:
int = -123456789 #=> Expected result -987654321
def minus_one(int) do
int * -1
end
def sign(int) when int > 0 do
int
|> Integer.to_string()
|> String.reverse()
|> String.to_integer()
end
def sign(int) do
int
|> Integer.to_string()
|> String.replace("-", "")
|> String.reverse()
|> String.to_integer()
|> minus_one()
end
def reverse_integer(int) do
sign(int)
end
Is there a native way to get the sign of a number? like :math.sign()
Any suggestions to improve the algorithm is welcome.
def sign(int) when int >= 0, do: 1
def sign(int) when int < 0, do: -1
def reverse(int) when int >= 0 do
int
|> Integer.to_string()
|> String.reverse()
|> String.to_integer()
end
def reset_sign(int, 1), do: int
def reset_sign(int, -1), do: int * -1
def reverse_integer(int) do
int
|> abs()
|> reverse()
|> reset_sign(sign(int))
end
I’ve previously looked for functions akin to neg?, pos?, and zero? in the standard library but I couldn’t find anything.
I hesitate to call it an improvement , but here’s what I came up with:
defmodule MyInt do
defp sign_prefix(int) when int < 0, do: "-"
defp sign_prefix(int), do: ""
def reverse(int) when is_integer(int) do
reversed_int = int
|> Integer.to_string
|> String.replace_leading("-", "")
|> String.reverse
"#{sign_prefix(int)}#{reversed_int}"
|> String.to_integer
end
end
Originally I noticed this on other data too, but I found that it is not a problem in this specific case, because as far as I know Integer.digits/1 will never return list like [1, -2, 3].
There is nothing surprising with 83 as result, because we have: (3 * 10^0) + (-2 * 10^1) + (1 * 10^2) i.e. (3 * 1) + (-2 * 10) + (1 * 100) i.e. 3 - 20 + 100 which gives 83.