Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/spider-gazelle/crunits
Physical quantity and units of measure conversion and math for crystal lang
https://github.com/spider-gazelle/crunits
Last synced: 25 days ago
JSON representation
Physical quantity and units of measure conversion and math for crystal lang
- Host: GitHub
- URL: https://github.com/spider-gazelle/crunits
- Owner: spider-gazelle
- License: mit
- Created: 2021-07-04T08:36:18.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2022-11-15T05:09:47.000Z (about 2 years ago)
- Last Synced: 2024-08-04T01:04:31.237Z (4 months ago)
- Language: Crystal
- Size: 43.9 KB
- Stars: 6
- Watchers: 5
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-crystal - crunits - Tool for converting units of measure (miles to kilometers, celsius to fahrenheit etc) (Converters)
README
# Creepy Units
[![CI](https://github.com/spider-gazelle/crunits/actions/workflows/ci.yml/badge.svg)](https://github.com/spider-gazelle/crunits/actions/workflows/ci.yml)
A Crystal lang library for unit measurement conversion and math.
## Installation
Add this to your application's `shard.yml`:
```yaml
dependencies:
crunits:
github: spider-gazelle/crunits
```## Usage
For an over the top example, consider a car (2800 lb) completing the quarter
mile in 10 seconds (with uniform acceleration).```crystal
require "crunits"
distance = Units::Measurement.new(0.25, "mile", :name) # => #
time = Units::Measurement.new(10, "second", :name) # => #
mass = Units::Measurement.new(2800, "pound", :name) # => #acceleration = distance * 2 / (time ** 2)
# => #force = (mass * acceleration).convert_to("lbf", :symbol)
# => #power = (force * distance / time).convert_to("horsepower", :name)
# => #```
### Comparison
It has the ability to compare measurements with the same or different units.
```crystal
Units::Measurement.new(12, "inch", :name) == Units::Measurement.new(1, "foot", :name)
Units::Measurement.new(1, "meter", :name) > Units::Measurement.new(1, "yard", :name) # => true
```Again, you have to compare compatible units. For example, comparing two
temperatures will work, comparing a mass to a length would fail.### SI abbreviations
You can use shorthand for SI units.
```crystal
Units::Measurement.new(1000, "m") == Units::Measurement.new(1, "km") # => true
Units::Measurement.new(1, "ml") == Units::Measurement.new(0.001, "l") # => true
```### Complex Units
Units can be combined to make more complex ones. There is nothing special about
them -- they can still be converted, compared, or operated on.```crystal
speed = Units::Measurement.new(60, "mile/hour", :name)
# => #speed.convert_to("m/s")
# => #
```### Math
You can add or subtract compatible measurements.
```crystal
Units::Measurement.new(2.0, "meter", :name) + Units::Measurement.new(3.0, "inch", :name) - Units::Measurement.new(1.0, "yard", :name)
# => #
```You can multiply or divide measurements and numbers.
```crystal
Units::Measurement.new(110, "volt", :name) * 2
# => #
```You can multiply or divide measurements with measurements.
```crystal
Units::Measurement.new(20, "mg") / Units::Measurement.new(1, "l")
# => #
```Exponentiation is also supported.
```crystal
(Units::Measurement.new(10, "cm") ** 3).convert_to("liter", :name)
# => #
```## Credits
inspired by [Unitwise Ruby gem](https://github.com/joshwlewis/unitwise)