ProductPromotion
Logo

Elixir

made by https://0x3d.site

GitHub - carturoch/ex_uc: Elixir Unit Converter
Elixir Unit Converter. Contribute to carturoch/ex_uc development by creating an account on GitHub.
Visit Site

GitHub - carturoch/ex_uc: Elixir Unit Converter

GitHub - carturoch/ex_uc: Elixir Unit Converter

ExUc - Elixir Unit Converter

Build Status

Converts values between units.

Installation

From Hex, the package can be installed as:

  1. Add ex_uc to your list of dependencies in mix.exs:
def deps do
  [{:ex_uc, "~> 1.2"}]
end

Requirements

This package requires Elixir 1.5+

Usage

The quickest way is the function convert:

iex>ExUc.convert("5 pounds", "oz")
"80.00 oz"

This is just a shortcut for the 3-steps pipeline:

import ExUc

new_val = from("5 pounds")  # %ExUc.Value{unit: :lb, value: 5, kind: :mass}
|> to(:oz)                  # %ExUc.Value{unit: :oz, value: 80, kind: :mass}
|> as_string                # "80.00 oz"

The same unit can be identified by several aliases:

convert("5 km", "miles") # "3.11 miles"
convert("5 kms", "mi") # "3.11 mi"
convert("5 kilometers", "mile") # "3.11 mile"
convert("5km", "mile") # "3.11 mile"

Errors

Only two errors are returned when found, both as self descriptive strings:

  • "undefined origin": Unit for the original value can't be parsed or found in any defined kind.
  • "undetermined conversion": Conversion between the given units can't be determined.

Configuration

Configurable variables are:

  • precision How many decimals will have the result when is converted into string
  • allow_exact_results When true, truncates decimal zeros in exact results.
  • units_modules Names of kinds of units used. Defaults to the included modules.

Could be set as:

config :ex_uc, precision: 2
config :ex_uc, allow_exact_results: false
config :ex_uc, units_modules: ~w(length mass)

Included Units

Included are some of the most frequent units grouped by kinds:

  • Length: (m, km, cm, mm, ft, in, yd, mi, ft_in).
  • Mass: (g, kg, mg, lb, oz, lb_oz).
  • Time: (μs, ms, s, min, h, d).
  • Temperature: (C, F, K).
  • Speed: (km/h, mph, m/s, kn).
  • Pressure: (Pa, hPa, kPa, bar, at, atm, mmHg, psi).
  • Memory: (B, KB, MB, GB, TB, PB, EB, ZB, YB, b, Kb, Mb, Gb, Tb, Pb, Eb, Zb, Yb, KiB, MiB, GiB, TiB, PiB, EiB, ZiB, YiB).

Extending ExUc

Overriding Conversions

Default conversions may be overridden just by providing a new value to in a configuration file:

config :ex_uc, :mass_conversions, # The kind suffixed with _conversions
  kg_to_lb: 2.20462 # More precise factor required
  # More units within this kind could go here

There are three types of conversion:

  • Factor: A numeric value, like in the previous example, that is gonna be used to multiply the origin value. Most conversions can use this type.

  • Formula: A function where one or more operation will performed to the origin value. Example:

config :ex_uc, :_temperature_conversions,
  C_to_F: &(&1 * 1.8 + 32),
  • Special: An atom referencing a function in a module. This function takes the origin value and returns a string. Right now this is only used for composed units and can not be overridden.

Updating Alias for Existent Units

An alias is just another term that can be used to reference an existent unit and therefore all its conversions.

config :ex_uc, :length_units, # The kind suffixed with _units
  m: ["meter", "meters", "mètre", "mètres"]

The main unit (m, in the sample) should be used as the key for the list of aliases, and such list must include every desired alias.

Every main unit and default aliases for included units, are in the docs in the Included Units and Aliases sections.

Adding New Units to Existent Kinds

New units can be added in configuration files by providing aliases for the new unit and a conversion to or from an existent unit of the same kind:

config :ex_uc, :length_units,
  dm: ~w(decimeter decimeters), # Main unit and aliases

config :ex_uc, :length_conversions,
  m_to_dm: 10, # A conversion from an existent unit

Adding New Kinds

New unit types (kinds) should be defined using configuration options for :ex_uc application. Each unit must have definitions for units and conversions (See some included examples at config/units in this repository).

A new kind should have this structure:

use Mix.Config

config :ex_uc, :<KIND>_units,
  <UNIT>: ["alias 1", "alias 2", "alias N"], # List with every alias intended to relate to unit identified by UNIT

config :ex_uc, :<KIND>_conversions,
  <UNIT_A>_to_<UNIT_B>: 0.001,      # Multiplication factor
  <UNIT_C>_to_<UNIT_D>: &(&1 + 5)   # Conversion formula.
  <UNIT_X>_to_<UNIT_Y>: :special    # Atom referencing a special method.  

This new kind will be included automatically without the need to specify it in :units_modules.

Better Unit Conversions

PRs or Issues with bugs, new units or more accurate default conversions are welcome.

Documentation

Detailed documentation can be found at hex docs.

Note

This project was inspired by the awesome Ruby gem by Kevin C. Olbrich, Ph.D.

License

MIT

Articles
to learn more about the elixir concepts.

Resources
which are currently available to browse on.

mail [email protected] to add your project or resources here 🔥.

FAQ's
to know more about the topic.

mail [email protected] to add your project or resources here 🔥.

Queries
or most google FAQ's about Elixir.

mail [email protected] to add more queries here 🔍.

More Sites
to check out once you're finished browsing here.

0x3d
https://www.0x3d.site/
0x3d is designed for aggregating information.
NodeJS
https://nodejs.0x3d.site/
NodeJS Online Directory
Cross Platform
https://cross-platform.0x3d.site/
Cross Platform Online Directory
Open Source
https://open-source.0x3d.site/
Open Source Online Directory
Analytics
https://analytics.0x3d.site/
Analytics Online Directory
JavaScript
https://javascript.0x3d.site/
JavaScript Online Directory
GoLang
https://golang.0x3d.site/
GoLang Online Directory
Python
https://python.0x3d.site/
Python Online Directory
Swift
https://swift.0x3d.site/
Swift Online Directory
Rust
https://rust.0x3d.site/
Rust Online Directory
Scala
https://scala.0x3d.site/
Scala Online Directory
Ruby
https://ruby.0x3d.site/
Ruby Online Directory
Clojure
https://clojure.0x3d.site/
Clojure Online Directory
Elixir
https://elixir.0x3d.site/
Elixir Online Directory
Elm
https://elm.0x3d.site/
Elm Online Directory
Lua
https://lua.0x3d.site/
Lua Online Directory
C Programming
https://c-programming.0x3d.site/
C Programming Online Directory
C++ Programming
https://cpp-programming.0x3d.site/
C++ Programming Online Directory
R Programming
https://r-programming.0x3d.site/
R Programming Online Directory
Perl
https://perl.0x3d.site/
Perl Online Directory
Java
https://java.0x3d.site/
Java Online Directory
Kotlin
https://kotlin.0x3d.site/
Kotlin Online Directory
PHP
https://php.0x3d.site/
PHP Online Directory
React JS
https://react.0x3d.site/
React JS Online Directory
Angular
https://angular.0x3d.site/
Angular JS Online Directory