The library implements quantities and units which included to basic SI.
The International System of Units, internationally known by the abbreviation SI (from French Système International), is the modern form of the metric system and the world's most widely used system of measurement. Established and maintained by the General Conference on Weights and Measures, it is the only system of measurement with an official status in nearly every country in the world, employed in science, technology, industry, and everyday commerce.
If available in Hex, the package can be installed
by adding si
to your list of dependencies in mix.exs
:
def deps do
[
{:si, "~> 1.5.1"}
]
end
iex(1)> SI.Unit.Kilogram.create(12.3)
%SI.Unit.Kilogram{value: 12.3}
For example if we wanna convert kilograms
to grams
we can use following code:
iex(1)> kg = SI.Unit.Kilogram.create(12.3)
%SI.Unit.Kilogram{value: 12.3}
iex(1)> SI.Unit.Gram.create(kg)
%SI.Unit.Gram{value: 12300}
By default library provides converting between units in the same quantity. That means, by default we can convert nanogram
to kilogram
or decagram
to gram
because they are belongs the same quantity. Converting between different quantities will raise an error.
iex(1)> SI.Unit.Gram.create SI.Unit.Ampere.create(123)
** (Protocol.UndefinedError) protocol SI.Unit.Gram.Generator not implemented for %SI.Unit.Ampere{value: 123.0} of type SI.Unit.Ampere (a struct). This protocol is implemented for the
following type(s): Float, Integer, SI.Unit.Attogram, SI.Unit.Centigram, SI.Unit.Decagram, SI.Unit.Decigram, SI.Unit.Exagram, SI.Unit.Femtogram, SI.Unit.Gigagram, SI.Unit.Hectogram,
SI.Unit.Kilogram, SI.Unit.Megagram, SI.Unit.Microgram, SI.Unit.Milligram, SI.Unit.Nanogram, SI.Unit.Petagram, SI.Unit.Picogram, SI.Unit.Teragram
(si 1.0.0) lib/unit/gram.ex:3: SI.Unit.Gram.Generator.impl_for!/1
(si 1.0.0) lib/unit/gram.ex:3: SI.Unit.Gram.Generator.create/1
iex:1: (file)
But you can make your own converting protocol if it necessary.
defimpl SI.Unit.Gram.Generator, for: SI.Unit.Ampere do
def create(term), do: SI.Unit.Gram.create(term.value * 3)
end
and now new converting is allowed
iex(1)> SI.Unit.Gram.create SI.Unit.Ampere.create(123)
%SI.Unit.Gram{value: 369.0}
Basically SI
provides 7 quantities and 7 basic units for them.
Name | Typical symbol | Module |
---|---|---|
time | t |
SI.Unit.Second |
length | l |
SI.Unit.Meter |
mass | m |
SI.Unit.Kilogram |
electric current | I |
SI.Unit.Ampere |
thermodynamic temperature | T |
SI.Unit.Kelvin |
amount of substance | n |
SI.Unit.Mole |
luminous intensity | lv |
SI.Unit.Candela |
Name | Symbol | Module |
---|---|---|
ampere | A |
SI.Unit.Ampere |
candela | cd |
SI.Unit.Candela |
gram | g |
SI.Unit.Gram |
kelvin | K |
SI.Unit.Kelvin |
meter | m |
SI.Unit.Meter |
mole | mol |
SI.Unit.Mole |
second | s |
SI.Unit.Second |
Getting all default quantities
iex(1)> SI.quantities
[
mass: SI.Quantity.Mass,
amount_of_substance: SI.Quantity.AmountOfSubstance,
time: SI.Quantity.Time,
thermodynamic_temperature: SI.Quantity.ThermodynamicTemperature,
luminous_intensity: SI.Quantity.LuminousIntensity,
length: SI.Quantity.Length,
electric_current: SI.Quantity.ElectricCurrent
]
Getting all default available modules grouped by quantity symbols
iex(1)> SI.units
[
time: [
second: SI.Unit.Second,
exasecond: SI.Unit.Exasecond,
petasecond: SI.Unit.Petasecond,
terasecond: SI.Unit.Terasecond,
gigasecond: SI.Unit.Gigasecond,
megasecond: SI.Unit.Megasecond,
kilosecond: SI.Unit.Kilosecond,
hectosecond: SI.Unit.Hectosecond,
decasecond: SI.Unit.Decasecond,
decisecond: SI.Unit.Decisecond,
centisecond: SI.Unit.Centisecond,
millisecond: SI.Unit.Millisecond,
microsecond: SI.Unit.Microsecond,
nanosecond: SI.Unit.Nanosecond,
picosecond: SI.Unit.Picosecond,
femtosecond: SI.Unit.Femtosecond,
attosecond: SI.Unit.Attosecond
],
thermodynamic_temperature: [
kelvin: SI.Unit.Kelvin,
exakelvin: SI.Unit.Exakelvin,
petakelvin: SI.Unit.Petakelvin,
terakelvin: SI.Unit.Terakelvin,
gigakelvin: SI.Unit.Gigakelvin,
megakelvin: SI.Unit.Megakelvin,
kilokelvin: SI.Unit.Kilokelvin,
hectokelvin: SI.Unit.Hectokelvin,
decakelvin: SI.Unit.Decakelvin,
decikelvin: SI.Unit.Decikelvin,
centikelvin: SI.Unit.Centikelvin,
millikelvin: SI.Unit.Millikelvin,
microkelvin: SI.Unit.Microkelvin,
nanokelvin: SI.Unit.Nanokelvin,
picokelvin: SI.Unit.Picokelvin,
femtokelvin: SI.Unit.Femtokelvin,
attokelvin: SI.Unit.Attokelvin
],
luminous_intensity: [
candela: SI.Unit.Candela,
exacandela: SI.Unit.Exacandela,
petacandela: SI.Unit.Petacandela,
teracandela: SI.Unit.Teracandela,
gigacandela: SI.Unit.Gigacandela,
megacandela: SI.Unit.Megacandela,
kilocandela: SI.Unit.Kilocandela,
hectocandela: SI.Unit.Hectocandela,
decacandela: SI.Unit.Decacandela,
decicandela: SI.Unit.Decicandela,
centicandela: SI.Unit.Centicandela,
millicandela: SI.Unit.Millicandela,
microcandela: SI.Unit.Microcandela,
nanocandela: SI.Unit.Nanocandela,
picocandela: SI.Unit.Picocandela,
femtocandela: SI.Unit.Femtocandela,
attocandela: SI.Unit.Attocandela
],
length: [
meter: SI.Unit.Meter,
exameter: SI.Unit.Exameter,
petameter: SI.Unit.Petameter,
terameter: SI.Unit.Terameter,
gigameter: SI.Unit.Gigameter,
megameter: SI.Unit.Megameter,
kilometer: SI.Unit.Kilometer,
hectometer: SI.Unit.Hectometer,
decameter: SI.Unit.Decameter,
decimeter: SI.Unit.Decimeter,
centimeter: SI.Unit.Centimeter,
millimeter: SI.Unit.Millimeter,
micrometer: SI.Unit.Micrometer,
nanometer: SI.Unit.Nanometer,
picometer: SI.Unit.Picometer,
femtometer: SI.Unit.Femtometer,
attometer: SI.Unit.Attometer
],
electric_current: [
ampere: SI.Unit.Ampere,
exaampere: SI.Unit.Exaampere,
petaampere: SI.Unit.Petaampere,
teraampere: SI.Unit.Teraampere,
gigaampere: SI.Unit.Gigaampere,
megaampere: SI.Unit.Megaampere,
kiloampere: SI.Unit.Kiloampere,
hectoampere: SI.Unit.Hectoampere,
decaampere: SI.Unit.Decaampere,
deciampere: SI.Unit.Deciampere,
centiampere: SI.Unit.Centiampere,
milliampere: SI.Unit.Milliampere,
microampere: SI.Unit.Microampere,
nanoampere: SI.Unit.Nanoampere,
picoampere: SI.Unit.Picoampere,
femtoampere: SI.Unit.Femtoampere,
attoampere: SI.Unit.Attoampere
],
amount_of_substance: [
mole: SI.Unit.Mole,
examole: SI.Unit.Examole,
petamole: SI.Unit.Petamole,
teramole: SI.Unit.Teramole,
gigamole: SI.Unit.Gigamole,
megamole: SI.Unit.Megamole,
kilomole: SI.Unit.Kilomole,
hectomole: SI.Unit.Hectomole,
decamole: SI.Unit.Decamole,
decimole: SI.Unit.Decimole,
centimole: SI.Unit.Centimole,
millimole: SI.Unit.Millimole,
micromole: SI.Unit.Micromole,
nanomole: SI.Unit.Nanomole,
picomole: SI.Unit.Picomole,
femtomole: SI.Unit.Femtomole,
attomole: SI.Unit.Attomole
],
mass: [
gram: SI.Unit.Gram,
exagram: SI.Unit.Exagram,
petagram: SI.Unit.Petagram,
teragram: SI.Unit.Teragram,
gigagram: SI.Unit.Gigagram,
megagram: SI.Unit.Megagram,
kilogram: SI.Unit.Kilogram,
hectogram: SI.Unit.Hectogram,
decagram: SI.Unit.Decagram,
decigram: SI.Unit.Decigram,
centigram: SI.Unit.Centigram,
milligram: SI.Unit.Milligram,
microgram: SI.Unit.Microgram,
nanogram: SI.Unit.Nanogram,
picogram: SI.Unit.Picogram,
femtogram: SI.Unit.Femtogram,
attogram: SI.Unit.Attogram
]
]
Every single basic unit by default has "prefixed" definitions.
Module | Name | Symbol | Multiplier |
---|---|---|---|
SI.Unit.Exagram |
exagram | Eg |
1018 |
SI.Unit.Petagram |
petagram | Pg |
1015 |
SI.Unit.Teragram |
teragram | Tg |
1012 |
SI.Unit.Gigagram |
gigagram | Gg |
109 |
SI.Unit.Megagram |
megagram | Mg |
106 |
SI.Unit.Kilogram |
kilogram | kg |
103 |
SI.Unit.Hectogram |
hectogram | hg |
102 |
SI.Unit.Decagram |
decagram | dag |
101 |
SI.Unit.Gram |
gram | dag |
100 |
SI.Unit.Decigram |
decigram | dg |
10-1 |
SI.Unit.Centigram |
centigram | cg |
10-2 |
SI.Unit.Milligram |
milligram | mg |
10-3 |
SI.Unit.Microgram |
microgram | ug |
10-6 |
SI.Unit.Nanogram |
nanogram | ng |
10-9 |
SI.Unit.Picogram |
picogram | pg |
10-12 |
SI.Unit.Femtogram |
femtogram | fg |
10-15 |
SI.Unit.Attogram |
attogram | ag |
10-18 |
Every "prefixed" unit has been created using multiplier module
Name | Prefix | Multiplier | Module |
---|---|---|---|
exa | E |
18 | SI.Multiplier.Exa |
peta | P |
15 | SI.Multiplier.Peta |
tera | T |
12 | SI.Multiplier.Tera |
giga | G |
9 | SI.Multiplier.Giga |
mega | M |
6 | SI.Multiplier.Mega |
kilo | k |
3 | SI.Multiplier.Kilo |
hecto | h |
2 | SI.Multiplier.Hecto |
deca | da |
1 | SI.Multiplier.Deca |
- | - | 0 | - |
deci | d |
-1 | SI.Multiplier.Deci |
centi | c |
-2 | SI.Multiplier.Centi |
milli | m |
-3 | SI.Multiplier.Milli |
micro | u |
-6 | SI.Multiplier.Micro |
nano | n |
-9 | SI.Multiplier.Nano |
pico | p |
-12 | SI.Multiplier.Pico |
femto | f |
-15 | SI.Multiplier.Femto |
atto | a |
-18 | SI.Multiplier.Atto |
The docs can be found at https://hexdocs.pm/si.
The SI
is released under the Apache License 2.0 - see the LICENSE file.