#measurement #temperature #length #weight #volume

no-std measurements

Handle metric, imperial, and other measurements with ease! Types: Length, Temperature, Weight, Volume, Pressure

15 releases (9 breaking)

Uses old Rust 2015

0.11.0 Feb 6, 2022
0.10.3 Oct 11, 2018
0.10.2 Mar 24, 2018
0.6.0 Oct 14, 2017
0.2.1 Jul 1, 2015

#30 in Value formatting

Download history 775/week @ 2024-07-22 895/week @ 2024-07-29 879/week @ 2024-08-05 1085/week @ 2024-08-12 2007/week @ 2024-08-19 1912/week @ 2024-08-26 2580/week @ 2024-09-02 1685/week @ 2024-09-09 2035/week @ 2024-09-16 2977/week @ 2024-09-23 2417/week @ 2024-09-30 1718/week @ 2024-10-07 2484/week @ 2024-10-14 2740/week @ 2024-10-21 2227/week @ 2024-10-28 2377/week @ 2024-11-04

9,864 downloads per month
Used in 19 crates (12 directly)

MIT license

225KB
5.5K SLoC

Type-safe units of measure for Rust

Build Status

Why should I care? I already have numbers...

Working with units can be very error prone. If one person is working in feet and one person is working in meters, what happens?

Doing all of your math in raw numerical types can be unsafe and downright confusing. What can we do to help?

Typed measurements to the rescue!

Working in typed measurements increases safety by dealing with what you really care about: units of measure.

Conversions to and from different units are simple, and operator overrides allow you to work with the measurements directly.

Currently available measurement types

  • Acceleration
  • Angle
  • Angular Velocity
  • Area
  • Current
  • Data (bytes, etc)
  • Density
  • Energy
  • Force
  • Frequency
  • Length
  • Humidity
  • Mass
  • Power
  • Pressure
  • Resistance
  • Speed
  • Temperature
  • Torque
  • Voltage
  • Volume

Examples

In your Cargo.toml add the dependency...

[dependencies]
measurements = "0.11"

In your code...

extern crate measurements;

use measurements::{Length, Pressure, Temperature, Volume, Weight};

fn main() {
    // Lengths!
    let football_field = Length::from_yards(100.0);
    let meters = football_field.as_meters();
    println!("There are {} meters in a football field.", meters);

    /// Temperatures!
    let boiling_water = Temperature::from_celsius(100.0);
    let fahrenheit = boiling_water.as_fahrenheit();
    println!("Boiling water measures at {} degrees fahrenheit.", fahrenheit);

    // Weights!
    let metric_ton = Weight::from_metric_tons(1.0);
    let united_states_tons = metric_ton.as_short_tons();
    let united_states_pounds = metric_ton.as_pounds();
    println!("One metric ton is {} U.S. tons - that's {} pounds!", united_states_tons, united_states_pounds);

    // Volumes!
    let gallon = Volume::from_gallons(1.0);
    let pint = Volume::from_pints(1.0);
    let beers = gallon / pint;
    println!("A gallon of beer will pour {:.1} pints!", beers);

    // Pressures!
    let atmosphere = Pressure::from_atmospheres(1.0);
    println!("Earth's atmosphere is usually {} psi", atmosphere.as_psi());
}

Features

The crate contains few features to disable or enable certain functionalities:

  • std
    • Enables functionality that Rust standard library provides instead of using libm for some math functions
  • from_str
    • Allows creating measurement units from string input

References

I am by no means a measurement or math expert, I simply wanted to do something useful while learning Rust. Thank you to these sites and their authors for the great reference material used in building this library.

Dependencies

~0.4–1MB
~20K SLoC