quantify 0.20.0
quantify: ^0.20.0 copied to clipboard
Type-safe unit conversion and measurement library. Convert 25+ units like length, mass, temperature, pressure, speed, and energy with compile-time safety and fast performance.
Changelog #
All notable changes to the quantify package will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.20.0 #
2026-03-30
Added #
- Added non-linear quantity families:
LevelRatio,PowerLevel,VoltageLevel,SoundPressureLevel, andFuelConsumption. - Added logarithmic bridge APIs for
Pressure <-> SoundPressureLevel,Power <-> PowerLevel, andVoltage <-> VoltageLevel. - Added granular entry points for the new families:
level_ratio.dart,power_level.dart,voltage_level.dart,fuel_consumption.dart, andsound_pressure_level.dart. - Added analyzer fixtures and validation tests for invalid arithmetic, barrel exports, and granular import safety.
- Added first-class
Whenergy support, includingEnergyUnit.wattHour,num.Wh,num.wattHours, parsing aliases, and unit-preservingWh <-> Wh/kginterop. - Added
QuantityFormat.compactFor(String locale)for deterministic compact formatting with an explicit locale, especially useful in multi-isolate code.
Changed — Breaking #
Quantityis now a sealed base class; custom quantities must extend the paradigm-specific base that matches their math model:LinearQuantity,AffineQuantity,InverseQuantity, orLogarithmicQuantity.- Arithmetic is no longer shared at the generic quantity level. Operator availability is now constrained by quantity paradigm.
- Absolute logarithmic levels support only physically valid operations such as
absolute + LevelRatio,absolute - absolute -> LevelRatio, andabsolute.subtract(LevelRatio). - Inverse quantities such as
FuelConsumptionintentionally do not expose generic+and-.
Changed #
Quantity.isEquivalentTo()now defaults to symmetric relative-only comparison. Near zero, passabsoluteToleranceexplicitly when needed.- Reciprocal conversions route through a canonical inverse space, preserving IEEE 754 behavior for zero and infinity.
- Fuel-consumption parsing and aliases now document explicitly that bare
mpgdefaults to US gallons; usempg(UK)for imperial gallons. PowerLevelandVoltageLevelnow applyLevelRatiooffsets directly in their current logarithmic unit, avoiding intermediate conversion objects while preserving the same results.- Public docs and examples now cover explicit logarithmic bridge usage, granular imports, and non-linear quantity semantics.
Migration Guide #
- When comparing near zero, pass an
absoluteToleranceexplicitly, for example(0.1.m + 0.2.m - 0.3.m).isEquivalentTo(0.m, absoluteTolerance: 1e-12).
0.18.1 #
2026-03-27
Added #
- New quantity:
Torque:- Added
TorqueUnitwith 9 units:newtonMeter(N·m),millinewtonMeter(mN·m),kilonewtonMeter(kN·m),meganewtonMeter(MN·m),poundFoot(lbf·ft),poundInch(lbf·in),kilogramForceMeter(kgf·m),ounceForceInch(ozf·in),dyneCentimeter(dyn·cm). - Added
Torque.from(Force, Length)factory with unit-preserving mapping for 10 common force × moment-arm combinations (N×m, N×mm, lbf×ft, kgf×m, dyn×cm, etc.). - Added
momentArmFor(Force)andforceAt(Length)inverse instance methods. - Full
numextension support:50.Nm,35.lbfFt,9.kgfM,55.ozfIn, etc. - Added
lib/torque.dartfor selective import without the full library. - Torque is intentionally a separate type from
Energydespite the shared N·m dimension, preserving the library's compile-time type-safety guarantee.
- Added
0.18.0 #
2026-03-25
Added #
- New quantity:
Voltage(Electric Potential):- Added
VoltageUnitwith SI prefixed units (nV,µV,mV,V,kV,MV,GV) and CGS units (statV,abV). - Added
Voltage.fromPowerAndCurrent(Power, Current)— V = P / I. - Added
Voltage.fromEnergyAndCharge(Energy, ElectricCharge)— V = E / Q. - Added
Voltage.currentThrough(Resistance)— I = V / R (Ohm's law). - Added
ElectricPotentialtype alias for formal contexts. - Full
numextension support:12.V,3.3.kV,12.volts,3.3.kilovolts, etc.
- Added
- New quantity:
Resistance:- Added
ResistanceUnitwith SI prefixed units (nΩ,µΩ,mΩ,Ω,kΩ,MΩ,GΩ). - Added
Resistance.fromOhmsLaw(Voltage, Current)— R = V / I. - Added
Resistance.voltageAt(Current)— V = I × R andResistance.currentAt(Voltage)— I = V / R. - Full
numextension support:470.ohms,4.7.kiloohms,10.megaohms, etc.
- Added
Changed — Non-Breaking #
QuantityFormat.compactis now cached with locale-aware invalidation. The instance is reused across consecutive accesses within the same locale, eliminating repeatedNumberFormat.compact()allocations in hot loops. The cache automatically invalidates whenIntl.defaultLocalechanges.
Changed — Breaking #
-
Unit-preserving dimensional factories — All factory constructors and inverse instance methods now return results in the unit system of their primary input operand, consistent with the existing arithmetic operator convention ("left operand wins"):
Area.from(9.inch, 9.inch)→81.0 in²(was0.052 m²)Volume.from(2.ft, 3.ft, 4.ft)→24.0 ft³(was0.679 m³)Speed.from(100.km, 1.hours)→100.0 km/h(was27.78 m/s)Density.from(13.5.g, 1.0.cm3).massOf(10.cm3)→ result in grams (was kilograms)Power.from(1.kWh, 1.hours)→1.0 kW(was1000.0 W)Energy.from(1.kW, 1.hours)→1.0 kWh(was3600000.0 J)- All Tier 1 (area/volume), Tier 2 (compound factories), and Tier 3 (inverse instance
methods:
massOf,volumeFor,timeFor,distanceOver,totalAngleOver,energyIn) follow this rule. - SI fallback: inputs with no natural output unit counterpart (e.g.
nauticalMilefor area, or mixed unit combinations) continue to return SI results. Never throws. - Migration: code reading
.valuedirectly from factory results may see different numbers for non-SI inputs. Use.inXxxgetters (e.g..inSquareMeters) for unit-independent access — these are unaffected.
-
FrequencyCreationRpm.rpmrenamed toFrequencyCreationRpm.freqRpmto resolve an extension collision withAngularVelocityCreation.rpm(which returnsAngularVelocity).- Previously the
FrequencyCreationRpmextension was hidden from the barrel export (lib/quantify.dart) to avoid the conflict. It is now fully exported under the new name. - Migration: replace
3000.rpm(when you intendFrequency) with3000.freqRpm. Use3000.rpmwhen you intendAngularVelocity— that getter is unchanged.
- Previously the
0.17.0 #
2026-03-24
Changed — Breaking #
- Removed non-SI and hybrid
numcreation aliases deprecated in 0.16.0, in favour of proper SI symbols and full-word forms:Frequency:hz,khz,mhz,ghz,thz→ useHz,kHz,MHz,GHz,THz.Length:megaM,gigaM→ useMm,Gm.Acceleration:mpsSquared→ usemPerS2.ElectricCharge:ah→ useAh.Energy:megaJ→ useMJ.Force:megaN,microjoules(was misnamed — mapped to micronewton) → useMN,uN.Mass:megaG,gigaG→ useMg,Gg.Power:megaW,gigaW→ useMW,GW.Pressure:pa,mpa,megaPascals,kiloPascals→ usePa,MPa,megapascals,kilopascals.SpecificEnergy:jPerKg→ usejPerKilogram.Time:kiloS,megaS,gigaS→ useks,Ms,Gs.Volume:l,ml,cl,ul,megaliter,gigaliter,teraliter→ useL,mL,cL,uL,megaliters,gigaliters,teraliters.
Changed — Non-Breaking #
- Added full-word singular and plural
numcreation aliases across all quantities, completing the naming convention from 0.16.0 (e.g.meter/meters,kilometer/kilometers,gigameter/gigameters,atmospheres,bars,megapascals,kilopascals,millimetersOfMercury,megaseconds,gigaseconds,months,secs,mins,hrs,cubicMeters,megaliters,gigaliters,teraliters,cubicInches,cubicFeet,gallon,quart,pint,fluidOunce,tablespoons,bits,bytes,kilobytes–terabytes,kibibytes–tebibytes). - Added
in*/as*extension getters for units not previously covered (e.g.inTerahertz,inZbit,inYbit,inYB,inKiloseconds,inMegaseconds,inGigaseconds,inCenturies,inUPa,inGPa,asTerahertz,asZbit,asYbit,asGB,asTB,asKiB,asMiB,asTiB,asUPa,asGPa,asFortnights,asDecades,asCenturies).
0.16.1 #
Changed #
- Updated
intl,meta,test, andvery_good_analysisdependencies to latest versions.
0.16.0 #
2026-03-23
Added #
- Unified formatting and parsing API:
- Added immutable
QuantityFormat(includinginvariant,valueOnly,enUs,de,compact). - Added
parse()/tryParse()to concrete quantity types with prioritizedList<QuantityFormat>fallback.
- Added immutable
- New quantity:
Information:- Added
InformationUnitwith SI (b,B,kB...PB) and IEC (KiB...PiB) units.
- Added
- New extensibility and comparison capabilities:
- Added
LinearQuantity<T, Q>as a public base for custom linear quantities. - Added
Quantity.ratioTo(Quantity<T>). - Updated
isEquivalentTo({double tolerance = 1e-9})to use relative tolerance (IEEE 754-aware).
- Added
- New dimensional factories:
Area.from,Volume.from,Volume.fromArea,Power.from,Energy.from,Pressure.from,Force.fromPressure.- Added
AngularVelocity.from(Angle, Time).
Changed — Breaking #
Quantity.toString()API simplified: removed legacy formatting parameters (locale,fractionDigits,numberFormat,showUnitSymbol,unitSymbolSeparator) and replaced them withformat.- Migration examples:
toString(fractionDigits: 2)->toString(format: const QuantityFormat(fractionDigits: 2))toString(locale: 'de_DE', fractionDigits: 2)->toString(format: const QuantityFormat.forLocale('de_DE', fractionDigits: 2))toString(showUnitSymbol: false)->toString(format: QuantityFormat.valueOnly)toString(numberFormat: myNf)->toString(format: QuantityFormat.withNumberFormat(myNf))
- Migration examples:
- Division by zero now follows IEEE 754 for all linear quantities:
q / 0returnsinfinity,-infinity, orNaN(noArgumentError). Temperature.ratioTo()on absolute zero now returnsdouble.infinity(noArgumentError).
Changed — Non-Breaking #
- Standardized
numcreation naming (SI symbol + full-word aliases) across multiple quantities.- Added official SI-style getters (for example
Hz,kHz,MHz,GHz,THz,MPa,Mm,Gm,Mg,Gg,ks,Ms,Gs). - Added full-word aliases (for example
hertz,kilohertz,megapascals,megameters,kiloseconds). - Deprecated non-SI/hybrid variants (for example
hz,khz,mhz,ghz,thz,mpa,megaM,kiloS,megaPascals).
- Added official SI-style getters (for example
0.15.0 #
2026-02-23
Added #
-
New Quantity:
TemperatureDelta— a dedicated type for temperature changes (intervals), distinct from absoluteTemperaturepoints.TemperatureDeltaUnitenum with four linear units:kelvinDelta,celsiusDelta,fahrenheitDelta,rankineDelta.- Factors:
kelvinDelta=celsiusDelta= 1.0 K;fahrenheitDelta=rankineDelta= 5/9 K. - Full arithmetic:
TemperatureDelta + TemperatureDelta,- TemperatureDelta,* scalar,/ scalar. - Convenience extensions on
num:20.celsiusDelta,18.fahrenheitDelta,10.kelvinDelta,9.rankineDelta. - Value getters on
TemperatureDelta:inKelvinDelta,inCelsiusDelta,inFahrenheitDelta,inRankineDeltaandas*conversion variants. - Interop extension
TemperatureDeltaTemperatureInteropprovidingdelta.addTo(temperature)for the commutative form of heating. - Available via
package:quantify/quantify.dartor the new granularpackage:quantify/temperature_delta.dart.
-
Temperature.asDeltagetter — converts an absolute temperature to aTemperatureDeltarelative to absolute zero (always inkelvinDelta). Useful for formulas that require a Kelvin scalar magnitude, such as the ideal gas law or Boltzmann energy calculations. -
Temperature.ratioTo(Temperature other)— replacesoperator /for temperature ratios. Always converts both operands to Kelvin before dividing, ensuring thermodynamic validity regardless of the input scale (e.g.300.celsius.ratioTo(200.celsius)gives573.15 / 473.15, not3/2). ThrowsArgumentErrorif the divisor is absolute zero. -
Temperature.operator +(TemperatureDelta delta)— adds a delta to an absolute temperature, returning a newTemperaturein the same unit. Models heating. -
Temperature.subtract(TemperatureDelta delta)— subtracts a delta from an absolute temperature, returning a newTemperature. Named method (not an operator) becauseoperator -is reserved forTemperature - Temperature. Equivalent totemp + (delta * -1.0).
Changed — Breaking #
-
Temperature.operator -(Temperature other)now returnsTemperatureDelta(previously returneddouble). The result's unit mirrors the LHS unit (e.g. subtracting two Celsius temperatures yields acelsiusDelta).Migration: replace
double diff = t2 - t1;withdouble diff = (t2 - t1).inKelvinDelta;(or.inCelsiusDelta, etc.). -
Temperature.operator /removed. Usetemperature.ratioTo(other)instead. The new method always uses Kelvin, making the ratio physically meaningful for all input scales.Migration: replace
t2 / t1witht2.ratioTo(t1). -
EngineeringConstants.thermalExpansionnow acceptsTemperatureDeltainstead ofTemperature. The previous signature would apply the Kelvin affine offset to what should be a plain delta, producing results up to ~14× too large for typical Celsius inputs.Migration: replace
20.celsiuswith20.celsiusDelta, or pass the result oft2 - t1directly (it is now aTemperatureDelta). -
EngineeringConstants.conductiveHeatTransfernow acceptsTemperatureDeltainstead ofTemperature, for the same reason.Migration: replace
const Temperature(10, TemperatureUnit.kelvin)with10.kelvinDelta.
Fixed #
thermalExpansionandconductiveHeatTransferno longer misinterpret a temperature difference as an absolute temperature, eliminating a silent calculation error where20.celsiuswas internally treated as 293.15 K.
0.14.1 #
2026-02-20
Fixed #
- Quick Start code example had an undeclared variable that prevented compilation.
- Removed unused duplicate imports in mass conversion factors.
- Example project SDK constraint now matches the main package requirement (>=3.5.0).
Changed #
- Standardized barrel file exports for density and specific_energy to match other quantities. Removed unintended public export of internal factor constants.
0.14.0 #
2026-02-11
Added #
- Energy: International Table (IT) Calorie Variants:
- Added
EnergyUnit.calorieITandEnergyUnit.kilocalorieITfor International Table calorie (4.1868 J). - New extensions:
.calIT,.kcalIT,.caloriesIT,.kilocaloriesITfor creating Energy instances. - New getters:
.inCaloriesIT,.inKilocaloriesIT,.asCaloriesIT,.asKilocaloriesITfor conversions. - Existing
calorieandkilocalorieunits continue to use the thermochemical calorie (4.184 J) as the IUPAC/ISO standard.
- Added
Changed #
- Improved Pressure Unit Conversion Accuracy:
- Distinguished between Torr and mmHg (millimeter of mercury) for higher precision.
Torris now defined as exactly 1/760 of a standard atmosphere (101325/760 Pa).mmHguses the conventional value based on actual mercury density at 0°C (133.322387415 Pa).- The difference is approximately 0.000019 Pa, significant for high-precision scientific applications.
- Updated inHg (inch of mercury) conversion to be based on mmHg rather than Torr for consistency with scientific standards (NIST SP 811).
- Distinguished between Torr and mmHg (millimeter of mercury) for higher precision.
0.13.0 #
2026-01-12
- New Quantity: Density: Support for
kg/m³,g/cm³,g/mL. - New Quantity: Specific Energy: Support for
J/kg,Wh/kg,kWh/kg,kJ/kg. - Volume: Added
centiliter(cl) unit. - Improved: Complete unit tests for new quantities.
0.12.0 #
2025-08-11
Added #
- Major Feature: Comprehensive Constants Library.
- A library of over 100 type-safe constants, organized into three categories: PhysicalConstants, AstronomicalConstants, and EngineeringConstants.
- Constants are represented as Quantity objects wherever possible (e.g., PhysicalConstants.speedOfLight is a Speed object, AstronomicalConstants.standardGravity is an Acceleration object).
- Added convenience methods for common scientific and engineering formulas, such as PhysicalConstants.photonEnergy(), AstronomicalConstants.escapeVelocity(), and EngineeringConstants.mechanicalStress().
- Constants are accessible via a new, separate import: package:quantify/constants.dart.
0.11.0 #
2025-07-27
Changed #
- Conceptual Refinement of
FrequencyandAngularVelocity:Frequencyis now the comprehensive quantity for all periodic units (inverse time, T⁻¹), including rotational rates.AngularVelocityremains a distinct, specialized type for rotational mechanics to ensure semantic type safety.
Added #
FrequencyUnit Expansion: Addedrad/s(radian per second) anddeg/s(degree per second) toFrequency.- Interoperability Between
FrequencyandAngularVelocity:- Added a safe
.asFrequencygetter toAngularVelocityfor direct conversion to aFrequencyobject. - Added a guarded
.asAngularVelocitygetter toFrequencythat only converts compatible rotational units (rpm,rad/s,Hz, etc.) and throws anUnsupportedErrorfor non-rotational units (likebpmorMHz), preventing logical errors in calculations.
- Added a safe
0.10.0 #
2025-07-26
-
New Quantities:
EnergyandPower- Added the
Energyquantity with common units (J, kJ, MJ, kWh, kcal, eV, Btu). - Added the
Powerquantity with a comprehensive set of SI, engineering, and CGS units (W, kW, MW, GW, hp, PS, Btu/h, erg/s).
- Added the
-
Expanded Unit Coverage
- Added new units to
Acceleration(cm/s²),Force(gf, pdl), andElectricCharge(mAh, statC, abC)
- Added new units to
0.9.0 #
2025-07-22
- Added relational operators (
>,<,>=,<=) for all quantities. Comparisons are now more readable (e.g.,1.m > 99.cm). - Added
isEquivalentTo()method for explicit magnitude equality checks (e.g.,1.m.isEquivalentTo(100.cm)).
0.8.0 #
2025-07-22
- New Derived Quantities
Frequencywith units (Hz,MHz,GHz,THz,rpm, etc.).ElectricChargewith units (C,Ah,e,µC, etc.).SolidAnglewith units (sr,deg²,sp).
0.7.0 #
2025-07-16
- New Derived Quantity
Areawith units (m²,km²,ha,acre,yd²,ft², etc.).Volumewith comprehensive SI, US customary, and cooking units (m³,L,gal,fl-oz,tsp, etc.).
0.6.0 #
2025-07-05
- New Derived Quantities
Speed: Addedm/s,km/h,mph,kn,ft/s.Acceleration: Addedm/s²,g(standard gravity),km/h/s.Force: AddedN(Newton),lbf,dyn,kgf,kN.
0.5.0 #
2025-06-29
Added #
-
Expanded Unit Coverage:
- Length: Added Mm (megametre) and Gm (gigametre).
- Mass: Added Mg (megagram) and Gg (gigagram).
- Time: Added full range of SI prefixes (Gs to cs) and calendar units (fortnight, decade, century).
- ElectricCurrent: Added CGS units statA (statampere) and abA (abampere/biot).
-
Granular Exports: Added separate library entry points (e.g., package:quantify/length.dart) to allow for explicit imports and prevent namespace conflicts.
0.4.0 #
2025-06-23
Added #
-
New Quantity:
AngleAnglequantityAngleUnit:radian(rad): The SI-derived unit, used as the base for conversions.degree(°): The most common unit for angles.gradian(grad): Unit used in surveying (400 grad in a circle).revolution(rev): Represents a full circle or turn.arcminute('): High-precision unit (1/60 of a degree).arcsecond("): High-precision unit (1/60 of an arcminute).milliradian(mrad): Common in optics and ballistics.
- Standard arithmetic operators (
+,-,*,/) forAngle.
-
New Quantity:
AngularVelocityAngularVelocityquantity - represents rotational speed.AngularVelocityUnit:radianPerSecond(rad/s): The SI-derived unit.degreePerSecond(°/s).revolutionPerMinute(rpm): A widely used unit for rotational speed.revolutionPerSecond(rps).
- Standard arithmetic operators for
AngularVelocity.
0.3.0 #
2025-06-21
Added #
- Expanded Unit Coverage:
- Length:
- SI Prefixes:
hm(hectometer),dam(decameter),dm(decimeter),μm(micrometer),nm(nanometer),pm(picometer),fm(femtometer). - Astronomical:
AU(astronomical unit),ly(light year),pc(parsec). - Special:
Å(ångström).
- SI Prefixes:
- Mass:
- SI Prefixes:
hg(hectogram),dag(decagram),dg(decigram),cg(centigram),μg(microgram),ng(nanogram). - Imperial/US:
short ton,long ton. - Special:
u(atomic mass unit),ct(carat).
- SI Prefixes:
- Time:
- SI Prefixes:
μs(microsecond),ns(nanosecond),ps(picosecond). - Calendar:
wk(week),mo(month),yr(year).
- SI Prefixes:
- Temperature:
- Absolute Scale:
°R(rankine).
- Absolute Scale:
- Length:
0.2.0 #
2025-06-16
Added #
- New SI Base Quantity Types (completing all 7 SI base units):
- Mass:
Massclass andMassUnitenum (kg,g,mg,t(tonne),lb,oz,st(stone),slug).
- Amount of Substance (Molar Amount):
MolarAmountclass andMolarUnitenum (mol,mmol,µmol,nmol,pmol,kmol).
- Electric Current:
Currentclass andCurrentUnitenum (A,mA,µA,nA,kA).
- Luminous Intensity:
LuminousIntensityclass andLuminousIntensityUnitenum (cd,mcd,kcd).
- Mass:
0.1.0 #
2025-06-12
Added #
- Initial Release of
quantifyv0.1.0 - Core Functionality:
- Type-safe
Quantitybase class for representing physical quantities with a value and a unit. Unitinterface for defining conversion factors and symbols.- Immutable
Quantityobjects. doubleprecision for quantity values.- Elegant API with extension methods on
numfor quantity creation (e.g.,10.m,20.celsius). - Extension methods on
Quantityfor easy value retrieval in target units (e.g.,length.inKm) and for obtaining newQuantityobjects in target units (e.g.,length.asKm). - Configurable
toString()method onQuantityobjects supporting:- Conversion to a
targetUnitbefore formatting. - Fixed
fractionDigits. - Option to
showUnitSymbol. - Custom
unitSymbolSeparator. - Locale-aware number formatting via
localeparameter (usingintlpackage). - Full control over number formatting via
numberFormatparameter (usingintlpackage).
- Conversion to a
- Arithmetic operations (
+,-,*by scalar,/by scalar) for most quantities. - Specialized arithmetic for
Temperature(differenceT - Treturnsdouble, ratioT / Treturnsdouble). Comparableinterface implementation for sorting quantities by magnitude.==operator override for value and unit equality.
- Type-safe
- Supported Quantity Types (with units and extensions):
- Length: Meter (m), Kilometer (km), Centimeter (cm), Millimeter (mm), Inch (in), Foot (ft), Yard (yd), Mile (mi), Nautical Mile (nmi).
- Time: Second (s), Millisecond (ms), Minute (min), Hour (h), Day (d).
- Temperature: Kelvin (K), Celsius (°C), Fahrenheit (°F). Handles affine conversions correctly.
- Pressure: Pascal (Pa), Atmosphere (atm), Bar (bar), PSI (psi), Torr, mmHg, inHg, kPa, hPa, mbar, cmH₂O, inH₂O.
