Convertat

Convertat is a small Elixir library that provides functions for converting values from and to arbitrary bases.

Installation

To use this library with Mix, just declare its dependency in the mix.exs file:

defp deps do
  [
    # Using the hex package manager:
    {:convertat, "~> 1.0"},
    # or grabbing the latest version (master branch) from GitHub:
    {:convertat, github: "whatyouhide/convertat"},
  ]
end

Then run mix deps.get and go on with your life.

Usage

Convertat leverages on the power of the |> operator in order to provide a clean syntax for converting values between bases.

For example, say we want to convert the binary value "11011" (27 in base 10) to its hex representation:

"10110" |> Convertat.from_base(2) |> Convertat.to_base(16) #=> "1b"

That's pretty straightforward and, moreover, easily achievable using Elixir's standard library. In fact, when using integers as bases, you're limited to the standard 2..36 range. What about this:

"↑↓↑" |> Convertat.from_base(["↓", "↑"]) #=> 5

We just used a (binary, since it has two digits) base where the digits are the and characters.

Digits in list bases are listed from the least significant one to the most significant one; in the above example, would be 0 in the binary base while would be 1.

We can also use lists as values (instead of strings); this allows for some cool multicharacter-digits bases. Here's another binary base:

["foo", "bar"] |> Convertat.from_base(["bar", "foo"]) #=> 2

As you can see, digits significance in list values is the opposite from list bases: the least significant digits are on the right, like they would be in written numbers.

As you just saw, the from_base function converts a value in an arbitrary base to an integer in base 10. The to_base functions does the opposite: it converts an integer (in base 10) into a value in an arbitrary base.

20 |> Convertat.to_base(["a", "b"]) #=> "babaa"

As with from_base, bases can be integers (in the 2..36 range, just like with the standard library) or lists of digits.

By default, a string representation of the converted number is returned. You can also specify that you want a list:

16 |> Convertat.to_base(16, as_list: true) #=> "10"

This may seem useless, but think of the multichar-digits base from above:

2 |> Convertat.to_base(["bar", "foo"]) #=> "foobar"

How can you parse "foobar" back into a base 10 value with the same ["bar", "foo"] base?

base = ["bar", "foo"]
val = 2 |> Convertat.to_base(base, as_list: true) #=> val = ["foo", "bar"]
val |> Convertat.from_base(base) #=> 2

License

MIT © 2014 Andrea Leopardi, see the license file