mono/packages/osrl/documentation/unit-conv.md
2025-12-30 16:33:03 +01:00

9.6 KiB

Unit conversion

Here's how you move between the metric units for volume:

convert(1).from('l').to('ml');
// 1000

Jump from imperial to metric units the same way:

convert(1).from('lb').to('kg');
// 0.4536... (tested to 4 significant figures)

Just be careful not to ask for an impossible conversion:

convert(1).from('oz').to('fl-oz');
// throws -- you can't go from mass to volume!

You can ask convert-units to select the best unit for you. You can also optionally explicitly exclude orders of magnitude or specify a cut off number for selecting the best representation.

convert(12000).from('mm').toBest();
// { val: 12, unit: 'm', plural: 'Meters' } (the smallest unit with a value above 1)

convert(12000).from('mm').toBest({ exclude: ['m'] });
// { val: 1200, unit: 'cm', plural: 'Centimeters' } (the smallest unit excluding meters)

convert(900).from('mm').toBest({ cutOffNumber: 10 });
// { val: 90, unit: 'cm', plural: 'Centimeters' } (the smallest unit with a value equal to or above 10)

convert(1000).from('mm').toBest({ cutOffNumber: 10 });
// { val: 100, unit: 'cm', plural: 'Centimeters' } (the smallest unit with a value equal to or above 10)

You can get a list of the measures available to the current instance with .measures

convert().measures();
// [ 'length', 'mass', 'volume', ... ]

const differentConvert = configureMeasurements({
    volume,
    mass,
    length,
    area,
});
differentConvert().measures();
// [ 'length', 'mass', 'volume', 'area' ]

If you ever want to know the possible conversions for a unit, just use .possibilities

convert().from('l').possibilities();
// [ 'ml', 'l', 'tsp', 'Tbs', 'fl-oz', 'cup', 'pnt', 'qt', 'gal' ]

convert().from('kg').possibilities();
// [ 'mcg', 'mg', 'g', 'kg', 'oz', 'lb' ]

You can also get the possible conversions for a measure:

convert().possibilities('mass');
// [ 'mcg', 'mg', 'g', 'kg', 'oz', 'lb', 'mt', 't' ]

You can also get the all the available units:

convert().possibilities();
// [ 'mm', 'cm', 'm', 'in', 'ft-us', 'ft', 'mi', 'mcg', 'mg', 'g', 'kg', 'oz', 'lb', 'mt', 't', 'ml', 'l', 'tsp', 'Tbs', 'fl-oz', 'cup', 'pnt', 'qt', 'gal', 'ea', 'dz' ];

To get a detailed description of a unit, use describe

convert().describe('kg');
/*
  {
    abbr: 'kg',
    measure: 'mass',
    system: 'metric',
    singular: 'Kilogram',
    plural: 'Kilograms',
  }
*/

To get detailed descriptions of all units, use list.

convert().list();
/*
  [{
    abbr: 'kg',
    measure: 'mass',
    system: 'metric',
    singular: 'Kilogram',
    plural: 'Kilograms',
  }, ...]
*/

You can also get detailed descriptions of all units for a measure:

convert().list('mass');
/*
  [{
    abbr: 'kg',
    measure: 'mass',
    system: 'metric',
    singular: 'Kilogram',
    plural: 'Kilograms',
  }, ...]
*/

Custom Measures

It's possible to define custom measures if the ones packaged aren't what you need:

import configureMeasurements from 'convert-units';

const customMeasure = {
  systems: {
    A: {
      a: {
        name: {
          singular: 'a',
          plural: 'as',
        },
        // to_anchor: The factor used to reach the base unit
        // The base unit should have a to_anchor value of 1
        // Eg. 1 a -> al = 1a * 1e-1 (to_anchor of al) = 10 al
        to_anchor: 1,
      },
      al: {
        name: {
          singular: 'al',
          plural: 'als',
        },
        to_anchor: 1e-1,
      },
    },
    B: {
      b: {
        name: {
          singular: 'b',
          plural: 'bs',
        },
        to_anchor: 1,
      },
      bl: {
        name: {
          singular: 'bl',
          plural: 'bls',
        },
        to_anchor: 1e-1,
      },
    },
    C: {
      c: {
        name: {
          singular: 'c',
          plural: 'cs',
        },
        to_anchor: 1,
      },
      cl: {
        name: {
          singular: 'cl',
          plural: 'cls',
        },
        to_anchor: 1e-1,
      },
    },
  },
  anchors: {
    A: {
      // unit a -> unit b
      B: {
        ratio: 2,
      },
      // unit a -> unit c
      C: {
        ratio: 3,
      },
    },
    B: {
      // unit b -> unit a
      A: {
        ratio: 1 / 2,
      },
      // unit b -> unit c
      C: {
        ratio: 3 / 2,
      },
    },
    C: {
      // unit c -> unit a
      A: {
        ratio: 1 / 3,
      },
      // unit c -> unit b
      B: {
        ratio: 2 / 3,
      },
    },
  },
};

const convert = configureMeasurements({ customMeasure });
convert(1).from('a').to('bl')
// 20

The order of opperations goes as follows:

// a -> bl
let v = 1  // 1 a
let a_to_anchor = 1  // systems.A.a.to_anchor
let r = v * a_to_anchor
// r = 1 a
let ratio = 2  // anchors.A.B.ratio
r *= ratio
// r = 2 b
let bl_to_anchor = 1e-1  // systems.B.bl.to_anchor
r /= b_to_anchor
// r = 20 bl

It's also possible to extend existing measures:

import configureMeasurements, {
  length,
  LengthSystems,
  LengthUnits,
  Measure
} from 'convert-units';

type NewLengthUnits = LengthUnits | 'px';
const DPI = 96;
const extendedLength: Measure<LengthSystems, NewLengthUnits> = {
  systems: {
    metric: {
      ...length.systems.metric,
      px: {
        name: {
          singular: 'Pixel',
          plural: 'Pixels',
        },
        to_anchor: 0.0254 / DPI,
      },
    },
    imperial: {
      ...length.systems.imperial,
    },
  },
  anchors: {
    ...length.anchors,
  },
};

const convert = configureMeasurements<'length', LengthSystems, NewLengthUnits>(
  { length: extendedLength }
);

convert(4).from('cm').to('px');
// 151.18110236220474

Migrating from Old API

This only applies if moving from <=2.3.4 to >=3.x.

index.js

import convert from 'convert-units';

convert(1).from('m').to('mm');
convert(1).from('m').to('ft');

The code above could be changed to match the following:

index.js

import convert from './convert';  // defined below

convert(1).from('m').to('mm');
convert(1).from('m').to('ft');

convert.js

import configureMeasurements, { allMeasures } from 'convert-units';

export default configureMeasurements(allMeasures);

Typescript

Defining types can provide the benefit of exposing issues while working on your application.

import configureMeasurements, {
  AllMeasures,
  allMeasures,
  AllMeasuresSystems,
  AllMeasuresUnits,
  area,
  AreaSystems,
  AreaUnits,
  length,
  LengthSystems,
  LengthUnits,
} from 'convert-units';

// Meausres: The names of the measures being used
type Measures = 'length' | 'area';
// Systems: The systems being used across all measures
type Systems = LengthSystems | AreaSystems;
// Units: All the units across all measures and their systems
type Units = LengthUnits | AreaUnits;
const convert = configureMeasurements<Measures, Systems, Units>({
  length,
  area,
});

convert(4).from('m').to('cm');
// 400

// If you'd like to use all the packages measures that can be done like so
const convertAll = configureMeasurements<
  AllMeasures,
  AllMeasuresSystems,
  AllMeasuresUnits
>(allMeasures);

convertAll(4).from('m2').to('cm2');
// 400000

Request Measures & Units

All new measures and additional units are welcome! Take a look at src/definitions to see some examples.

Packaged Units

Length

  • nm
  • μm
  • mm
  • cm
  • m
  • km
  • in
  • yd
  • ft-us
  • ft
  • fathom
  • mi
  • nMi

Area

  • mm2
  • cm2
  • m2
  • ha
  • km2
  • in2
  • ft2
  • ac
  • mi2

Mass

  • mcg
  • mg
  • g
  • kg
  • oz
  • lb
  • mt
  • t

Volume

  • mm3
  • cm3
  • ml
  • l
  • kl
  • m3
  • km3
  • tsp
  • Tbs
  • in3
  • fl-oz
  • cup
  • pnt
  • qt
  • gal
  • ft3
  • yd3

Volume Flow Rate

  • mm3/s
  • cm3/s
  • ml/s
  • cl/s
  • dl/s
  • l/s
  • l/min
  • l/h
  • kl/s
  • kl/min
  • kl/h
  • m3/s
  • m3/min
  • m3/h
  • km3/s
  • tsp/s
  • Tbs/s
  • in3/s
  • in3/min
  • in3/h
  • fl-oz/s
  • fl-oz/min
  • fl-oz/h
  • cup/s
  • pnt/s
  • pnt/min
  • pnt/h
  • qt/s
  • gal/s
  • gal/min
  • gal/h
  • ft3/s
  • ft3/min
  • ft3/h
  • yd3/s
  • yd3/min
  • yd3/h'

Temperature

  • C
  • F
  • K
  • R

Time

  • ns
  • mu
  • ms
  • s
  • min
  • h
  • d
  • week
  • month
  • year

Frequency

  • Hz
  • mHz
  • kHz
  • MHz
  • GHz
  • THz
  • rpm
  • deg/s
  • rad/s

Speed

  • m/s
  • km/h
  • mph
  • knot
  • ft/s

Pace

  • s/m
  • min/km
  • s/ft
  • min/mi

Pressure

  • Pa
  • hPa
  • kPa
  • MPa
  • bar
  • torr
  • psi
  • ksi

Digital

  • b
  • Kb
  • Mb
  • Gb
  • Tb
  • B
  • KB
  • MB
  • GB
  • TB

Illuminance

  • lx
  • ft-cd

Parts-Per

  • ppm
  • ppb
  • ppt
  • ppq

Voltage

  • V
  • mV
  • kV

Current

  • A
  • mA
  • kA

Power

  • W
  • mW
  • kW
  • MW
  • GW
  • PS
  • Btu/s
  • ft-lb/s
  • hp

Apparent Power

  • VA
  • mVA
  • kVA
  • MVA
  • GVA

Reactive Power

  • VAR
  • mVAR
  • kVAR
  • MVAR
  • GVAR

Energy

  • Wh
  • mWh
  • kWh
  • MWh
  • GWh
  • J
  • kJ

Reactive Energy

  • VARh
  • mVARh
  • kVARh
  • MVARh
  • GVARh

Angle

  • deg
  • rad
  • grad
  • arcmin
  • arcsec

Charge

  • c
  • mC
  • μC
  • nC
  • pC

Force

  • N
  • kN
  • lbf

Acceleration

  • g (g-force)
  • m/s2

Pieces

  • pcs
  • bk-doz
  • cp
  • doz-doz
  • doz
  • gr-gr
  • gros
  • half-dozen
  • long-hundred
  • ream
  • scores
  • sm-gr
  • trio