public void poetic_units()
        {
            var metre            = MeasureUnit.Metre;
            var decimetre        = MeasureStandardPrefix.Deci[metre];
            var centimetre       = MeasureStandardPrefix.Centi[metre];
            var kilometre        = MeasureStandardPrefix.Kilo[metre];
            var hundredKilometre = MeasureStandardPrefix.Hecto[kilometre];
            var litre            = decimetre ^ 3;

            var inch   = MeasureUnit.DefineAlias("in", "Inch", 2.54, centimetre);
            var gallon = MeasureUnit.DefineAlias("gal", "US Gallon", 231, inch ^ 3);

            var mile = MeasureUnit.DefineAlias("mile", "Mile", 1.609344, kilometre);

            var milesPerGalon            = mile / gallon;
            var litrePerHundredKilometer = litre / hundredKilometre;

            milesPerGalon.Normalization.Abbreviation.Should().Be("m-2");
            litrePerHundredKilometer.Normalization.Abbreviation.Should().Be("m2");

            var oneMilesPerGallon = 1.WithUnit(milesPerGalon);

            oneMilesPerGallon.CanConvertTo(litrePerHundredKilometer).Should().BeTrue();
            var result = oneMilesPerGallon.ConvertTo(litrePerHundredKilometer);

            result.Value.Should().BeApproximately(235.215, 1e-3);
        }
        public void dimensionless_quantity_like_percent_or_permille_works()
        {
            var percent        = MeasureUnit.DefineAlias("%", "Percent", new ExpFactor(0, -2), MeasureUnit.None);
            var permille       = MeasureUnit.DefineAlias("‰", "Permille", new ExpFactor(0, -3), MeasureUnit.None);
            var pertenthousand = MeasureUnit.DefineAlias("‱", "Pertenthousand", new ExpFactor(0, -4), MeasureUnit.None);

            var pc10 = 10.WithUnit(percent);

            pc10.ToString().Should().Be("10 %");

            var pm20 = 20.WithUnit(permille);

            pm20.ToString().Should().Be("20 ‰");

            var pt30 = 30.WithUnit(pertenthousand);

            pt30.ToString().Should().Be("30 ‱");

            (pc10 * pm20 * pt30).ToString().Should().Be("6000 10^-9");

            (pc10 + pm20 + pt30).ToString(CultureInfo.InvariantCulture).Should().Be("12.3 %");
            (pt30 + pc10 + pm20).ToString(CultureInfo.InvariantCulture).Should().Be("1230 ‱");

            var km          = MeasureStandardPrefix.Kilo[MeasureUnit.Metre];
            var km100       = 100.WithUnit(MeasureStandardPrefix.Kilo[MeasureUnit.Metre]);
            var pc10OfKm100 = pc10 * km100;

            pc10OfKm100.ToString().Should().Be("1000 10^-2.km");
            pc10OfKm100.ConvertTo(km).ToString().Should().Be("10 km");
        }
示例#3
0
        public void dimensionless_units()
        {
            // See https://en.wikipedia.org/wiki/Per_mille
            var percent        = MeasureUnit.DefineAlias("%", "Percent", new ExpFactor(0, -2), MeasureUnit.None);
            var permille       = MeasureUnit.DefineAlias("‰", "Permille", new ExpFactor(0, -3), MeasureUnit.None);
            var pertenthousand = MeasureUnit.DefineAlias("‱", "Pertenthousand", new ExpFactor(0, -4), MeasureUnit.None);

            percent.ToString().Should().Be("%");
            percent.Normalization.Should().BeSameAs(MeasureUnit.None);
            percent.NormalizationFactor.Should().Be(new FullFactor(new ExpFactor(0, -2)));

            var perht = percent * permille;

            perht.ToString().Should().Be("10^-5");
            perht.Normalization.Should().BeSameAs(MeasureUnit.None);
            perht.NormalizationFactor.Should().Be(new FullFactor(new ExpFactor(0, -5)));
        }
示例#4
0
        public void combined_units_with_factor()
        {
            var metre  = MeasureUnit.Metre;
            var second = MeasureUnit.Second;
            var speed  = metre / second;

            speed.IsNormalized.Should().BeTrue();

            var kilometre = MeasureStandardPrefix.Kilo[metre];
            var hour      = MeasureUnit.DefineAlias("h", "Hour", 60 * 60, second);
            var speed2    = kilometre / hour;

            speed2.IsNormalized.Should().BeFalse();

            speed2.Normalization.Should().BeSameAs(speed);
            speed2.NormalizationFactor.ToDouble().Should().BeApproximately(0.2777777778, 1e-10, "1 m/s = 0.277778 km/h");
        }
        public void combining_same_dimension()
        {
            var metre      = MeasureUnit.Metre;
            var decimetre  = MeasureStandardPrefix.Deci[metre];
            var centimetre = MeasureStandardPrefix.Centi[metre];

            var r10 = metre.DivideBy(decimetre);

            r10.Normalization.Should().Be(MeasureUnit.None);
            r10.NormalizationFactor.Factor.Should().Be(1.0);
            r10.NormalizationFactor.ExpFactor.Exp10.Should().Be(1);
            r10.NormalizationFactor.ExpFactor.Exp2.Should().Be(0);

            var inch  = MeasureUnit.DefineAlias("in", "Inch", 2.54, centimetre);
            var rInch = inch / centimetre;

            rInch.Normalization.Should().Be(MeasureUnit.None);
            rInch.NormalizationFactor.Factor.Should().Be(2.54);
            rInch.NormalizationFactor.ExpFactor.Exp10.Should().Be(0);
            rInch.NormalizationFactor.ExpFactor.Exp2.Should().Be(0);
        }
        public void percent_or_other_dimensionless_units_are_convertible_into_each_other()
        {
            var percent = MeasureUnit.DefineAlias("%", "Percent", new ExpFactor(0, -2), MeasureUnit.None);
            var pc10    = 10.WithUnit(percent);

            pc10.ToString().Should().Be("10 %");
            pc10.CanConvertTo(MeasureUnit.None).Should().Be(true, $"{percent.Name} should be convertible to {MeasureUnit.None.Name}");

            var noDimension = pc10.ConvertTo(MeasureUnit.None);

            noDimension.Unit.Should().Be(MeasureUnit.None);
            noDimension.Value.Should().Be(0.01 * pc10.Value, $"is {pc10.ToString()}");

            // Now, express the ratio in permille.
            var permille = MeasureUnit.DefineAlias("‰", "Permille", new ExpFactor(0, -3), MeasureUnit.None);

            noDimension.CanConvertTo(permille).Should().BeTrue();
            var inPerMille = noDimension.ConvertTo(permille);

            inPerMille.Unit.Should().Be(permille);
            inPerMille.Value.Should().Be(10 * pc10.Value, $"is {pc10.ToString()}");
        }