Current section

Files

Jump to
henchman lib converter length.ex
Raw

lib/converter/length.ex

defmodule Henchman.Converter.Length do
@behaviour Henchman.Converter
alias Henchman.Converter.ConversionUnitError
@doc """
Length unit conversion.
## Supported unit
* ```:millimetre```
* ```:centimetre```
* ```:metre```
* ```:kilometre```
* ```:inch```
* ```:foot```
* ```:mile```
## Example
iex> Henchman.Converter.Length(1, :metre, :kilometre)#0.001
iex> Henchman.Converter.Length(1, :metre, :centimetre, true)#100.0 cm
"""
def convert(value, from, to, show_unit \\ false, precision \\ 4) do
[from_rate, _] = get_conversion_rate(from)
[to_rate, to_unit] = get_conversion_rate(to)
converted_value =
(value/from_rate)/to_rate
|> Float.round(precision)
if show_unit, do: Float.to_string(converted_value) <> " " <> to_unit, else: converted_value
end
defp get_conversion_rate(unit) when unit == :millimetre, do: [0.001, "mm"]
defp get_conversion_rate(unit) when unit == :centimetre, do: [0.01, "cm"]
defp get_conversion_rate(unit) when unit == :metre, do: [1, "m"]
defp get_conversion_rate(unit) when unit == :kilometre, do: [1000, "km"]
defp get_conversion_rate(unit) when unit == :inch, do: [0.0254, "in"]
defp get_conversion_rate(unit) when unit == :foot, do: [0.3048, "ft"]
defp get_conversion_rate(unit) when unit == :yard, do: [0.9144, "yd"]
defp get_conversion_rate(unit) when unit == :mile, do: [1609.34, "mi"]
defp get_conversion_rate(unit), do: raise ConversionUnitError, "Unit #{unit} is not available"
end