From e2f141427e441daa9d6be0ba8a30b844ca4391e0 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Thu, 27 Aug 2020 08:07:21 -0500 Subject: Added the ability to restrict conversion to customary->metric. --- src/org/unitConverter/unit/SI.java | 59 ++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 25 deletions(-) (limited to 'src/org/unitConverter/unit/SI.java') diff --git a/src/org/unitConverter/unit/SI.java b/src/org/unitConverter/unit/SI.java index a4fbd5f..f36cf28 100644 --- a/src/org/unitConverter/unit/SI.java +++ b/src/org/unitConverter/unit/SI.java @@ -17,6 +17,7 @@ package org.unitConverter.unit; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -91,6 +92,9 @@ public final class SI { public static final BaseUnit DOLLAR = BaseUnit .valueOf(BaseDimensions.CURRENCY, "dollar", "$"); + public static final Set BASE_UNITS = setOf(METRE, KILOGRAM, + SECOND, AMPERE, KELVIN, MOLE, CANDELA, BIT); + // You may NOT get SI.BaseUnits instances! private BaseUnits() { throw new AssertionError(); @@ -210,6 +214,7 @@ public final class SI { /// The units of the SI public static final LinearUnit ONE = LinearUnit .valueOf(ObjectProduct.empty(), 1); + public static final LinearUnit METRE = BaseUnits.METRE.asLinearUnit() .withName(NameSymbol.of("metre", "m", "meter")); public static final LinearUnit KILOGRAM = BaseUnits.KILOGRAM.asLinearUnit() @@ -228,10 +233,10 @@ public final class SI { .withName(NameSymbol.of("bit", "b")); public static final LinearUnit DOLLAR = BaseUnits.DOLLAR.asLinearUnit() .withName(NameSymbol.of("dollar", "$")); - // Non-base units public static final LinearUnit RADIAN = METRE.dividedBy(METRE) .withName(NameSymbol.of("radian", "rad")); + public static final LinearUnit STERADIAN = RADIAN.times(RADIAN) .withName(NameSymbol.of("steradian", "sr")); public static final LinearUnit HERTZ = ONE.dividedBy(SECOND) @@ -277,10 +282,10 @@ public final class SI { // for dose equivalent public static final LinearUnit KATAL = MOLE.dividedBy(SECOND) .withName(NameSymbol.of("katal", "kat")); - // common derived units included for convenience public static final LinearUnit GRAM = KILOGRAM.dividedBy(1000) .withName(NameSymbol.of("gram", "g")); + public static final LinearUnit SQUARE_METRE = METRE.toExponent(2) .withName(NameSymbol.of("square metre", "m^2", "square meter", "metre squared", "meter squared")); @@ -290,12 +295,12 @@ public final class SI { public static final LinearUnit METRE_PER_SECOND = METRE.dividedBy(SECOND) .withName( NameSymbol.of("metre per second", "m/s", "meter per second")); - // Non-SI units included for convenience public static final Unit CELSIUS = Unit .fromConversionFunctions(KELVIN.getBase(), tempK -> tempK - 273.15, tempC -> tempC + 273.15) .withName(NameSymbol.of("degree Celsius", "\u00B0C")); + public static final LinearUnit MINUTE = SECOND.times(60) .withName(NameSymbol.of("minute", "min")); public static final LinearUnit HOUR = MINUTE.times(60) @@ -324,7 +329,7 @@ public final class SI { .withName(NameSymbol.of("tonne", "t", "metric ton")); public static final LinearUnit DALTON = KILOGRAM.times(1.660539040e-27) .withName(NameSymbol.of("dalton", "Da", "atomic unit", "u")); // approximate - // value + // value public static final LinearUnit ELECTRONVOLT = JOULE.times(1.602176634e-19) .withName(NameSymbol.of("electron volt", "eV")); public static final LinearUnit BYTE = BIT.times(8) @@ -339,11 +344,11 @@ public final class SI { .fromConversionFunctions(ONE.getBase(), pr -> 10 * Math.log10(pr), dB -> Math.pow(10, dB / 10)) .withName(NameSymbol.of("decibel", "dB")); - /// The prefixes of the SI // expanding decimal prefixes public static final UnitPrefix KILO = UnitPrefix.valueOf(1e3) .withName(NameSymbol.of("kilo", "k", "K")); + public static final UnitPrefix MEGA = UnitPrefix.valueOf(1e6) .withName(NameSymbol.of("mega", "M")); public static final UnitPrefix GIGA = UnitPrefix.valueOf(1e9) @@ -358,10 +363,10 @@ public final class SI { .withName(NameSymbol.of("zetta", "Z")); public static final UnitPrefix YOTTA = UnitPrefix.valueOf(1e24) .withName(NameSymbol.of("yotta", "Y")); - // contracting decimal prefixes public static final UnitPrefix MILLI = UnitPrefix.valueOf(1e-3) .withName(NameSymbol.of("milli", "m")); + public static final UnitPrefix MICRO = UnitPrefix.valueOf(1e-6) .withName(NameSymbol.of("micro", "\u03BC", "u")); // mu public static final UnitPrefix NANO = UnitPrefix.valueOf(1e-9) @@ -376,10 +381,10 @@ public final class SI { .withName(NameSymbol.of("zepto", "z")); public static final UnitPrefix YOCTO = UnitPrefix.valueOf(1e-24) .withName(NameSymbol.of("yocto", "y")); - // prefixes that don't match the pattern of thousands public static final UnitPrefix DEKA = UnitPrefix.valueOf(1e1) .withName(NameSymbol.of("deka", "da", "deca", "D")); + public static final UnitPrefix HECTO = UnitPrefix.valueOf(1e2) .withName(NameSymbol.of("hecto", "h", "H", "hekto")); public static final UnitPrefix DECI = UnitPrefix.valueOf(1e-1) @@ -398,25 +403,29 @@ public final class SI { .withName(NameSymbol.of("pebi", "Pi")); public static final UnitPrefix EXBI = PEBI.times(1024) .withName(NameSymbol.of("exbi", "Ei")); - // sets of prefixes - public static final Set ALL_PREFIXES = new HashSet<>( - Arrays.asList(DEKA, HECTO, KILO, MEGA, GIGA, TERA, PETA, EXA, ZETTA, - YOTTA, DECI, CENTI, MILLI, MICRO, NANO, PICO, FEMTO, ATTO, ZEPTO, - YOCTO, KIBI, MEBI, GIBI, TEBI, PEBI, EXBI)); - public static final Set DECIMAL_PREFIXES = new HashSet<>( - Arrays.asList(DEKA, HECTO, KILO, MEGA, GIGA, TERA, PETA, EXA, ZETTA, - YOTTA, DECI, CENTI, MILLI, MICRO, NANO, PICO, FEMTO, ATTO, ZEPTO, - YOCTO)); - public static final Set THOUSAND_PREFIXES = new HashSet<>( - Arrays.asList(KILO, MEGA, GIGA, TERA, PETA, EXA, ZETTA, YOTTA, MILLI, - MICRO, NANO, PICO, FEMTO, ATTO, ZEPTO, YOCTO)); - public static final Set MAGNIFYING_PREFIXES = new HashSet<>( - Arrays.asList(DEKA, HECTO, KILO, MEGA, GIGA, TERA, PETA, EXA, ZETTA, - YOTTA, KIBI, MEBI, GIBI, TEBI, PEBI, EXBI)); - public static final Set REDUCING_PREFIXES = new HashSet<>( - Arrays.asList(DECI, CENTI, MILLI, MICRO, NANO, PICO, FEMTO, ATTO, - ZEPTO, YOCTO)); + public static final Set ALL_PREFIXES = setOf(DEKA, HECTO, KILO, + MEGA, GIGA, TERA, PETA, EXA, ZETTA, YOTTA, DECI, CENTI, MILLI, MICRO, + NANO, PICO, FEMTO, ATTO, ZEPTO, YOCTO, KIBI, MEBI, GIBI, TEBI, PEBI, + EXBI); + + public static final Set DECIMAL_PREFIXES = setOf(DEKA, HECTO, + KILO, MEGA, GIGA, TERA, PETA, EXA, ZETTA, YOTTA, DECI, CENTI, MILLI, + MICRO, NANO, PICO, FEMTO, ATTO, ZEPTO, YOCTO); + public static final Set THOUSAND_PREFIXES = setOf(KILO, MEGA, + GIGA, TERA, PETA, EXA, ZETTA, YOTTA, MILLI, MICRO, NANO, PICO, FEMTO, + ATTO, ZEPTO, YOCTO); + public static final Set MAGNIFYING_PREFIXES = setOf(DEKA, HECTO, + KILO, MEGA, GIGA, TERA, PETA, EXA, ZETTA, YOTTA, KIBI, MEBI, GIBI, + TEBI, PEBI, EXBI); + public static final Set REDUCING_PREFIXES = setOf(DECI, CENTI, + MILLI, MICRO, NANO, PICO, FEMTO, ATTO, ZEPTO, YOCTO); + + // this method just calls Arrays.asList, which is itself safe. + @SafeVarargs + private static final Set setOf(T... args) { + return Collections.unmodifiableSet(new HashSet<>(Arrays.asList(args))); + } // You may NOT get SI instances! private SI() { -- cgit v1.2.3