.NET units class, inches to millimeters

前端 未结 7 797
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-04 07:42

Does .NET has Units conversion class? I need to convert inches to millimeters and vise versa.

相关标签:
7条回答
  • 2021-01-04 07:51

    No, you need to make one yourself, like this:

    public class Length
    {
        private const double MillimetersPerInch = 25.4;
        private double _Millimeters;
    
        public static Length FromMillimeters(double mm)
        {
             return new Length { _Millimeters = mm };
        }
    
        public static Length FromInch(double inch)
        {
             return new Length { _Millimeters = inch * MillimetersPerInch };
        }
    
        public double Inch { get { return _Millimeters / MillimetersPerInch; } } 
        public double Millimeters { get { return _Millimeters; } }
    }
    
    0 讨论(0)
  • 2021-01-04 07:52

    Csunits is a nice Units of Measurement library for C#, see https://github.com/cureos/csunits. It's currently geared towards radiotherapy but you can easily add your own units and quantities.

    0 讨论(0)
  • 2021-01-04 08:04

    A few Years later there are plenty of Nuget Packages that deal with this. One of them is https://github.com/angularsen/UnitsNet which is able to handle what you want.

    Length distance = Length.FromInch(15);
    distance.Millimeters/ 60;
    

    It also supports a lot of other stuff.

    0 讨论(0)
  • 2021-01-04 08:07

    I've dealt with this issue before. I recommend making two classes for distance. One that has the imperial measures and one that has the metric measures. Then, you can convert back and forth between them easily, with the obvious caveat that you lose precision when you do.

    Here's an example of an imperial distance class, with inches as the base unit of measure.

    public class ImperialDistance
    {
        public static readonly ImperialDistance Inch = new ImperialDistance(1.0);
        public static readonly ImperialDistance Foot = new ImperialDistance(12.0);
        public static readonly ImperialDistance Yard = new ImperialDistance(36.0);
        public static readonly ImperialDistance Mile = new ImperialDistance(63360.0);
    
        private double _inches;
    
        public ImperialDistance(double inches)
        {
            _inches = inches;
        }
    
        public double ToInches()
        {
            return _inches;
        }
    
        public double ToFeet()
        {
            return _inches / Foot._inches;
        }
    
        public double ToYards()
        {
            return _inches / Yard._inches;
        }
    
        public double ToMiles()
        {
            return _inches / Mile._inches;
        }
    
        public MetricDistance ToMetricDistance()
        {
            return new MetricDistance(_inches * 0.0254);
        }
    
        public override int GetHashCode()
        {
            return _inches.GetHashCode();
        }
    
        public override bool Equals(object obj)
        {
            var o = obj as ImperialDistance;
            if (o == null) return false;
            return _inches.Equals(o._inches);
        }
    
        public static bool operator ==(ImperialDistance a, ImperialDistance b)
        {
            // If both are null, or both are same instance, return true
            if (ReferenceEquals(a, b)) return true;
    
            // if either one or the other are null, return false
            if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) return false;
    
            // compare
            return a._inches == b._inches;
        }
    
        public static bool operator !=(ImperialDistance a, ImperialDistance b)
        {
            return !(a == b);
        }
    
        public static ImperialDistance operator +(ImperialDistance a, ImperialDistance b)
        {
            if (a == null) throw new ArgumentNullException();
            if (b == null) throw new ArgumentNullException();
            return new ImperialDistance(a._inches + b._inches);
        }
    
        public static ImperialDistance operator -(ImperialDistance a, ImperialDistance b)
        {
            if (a == null) throw new ArgumentNullException();
            if (b == null) throw new ArgumentNullException();
            return new ImperialDistance(a._inches - b._inches);
        }
    
        public static ImperialDistance operator *(ImperialDistance a, ImperialDistance b)
        {
            if (a == null) throw new ArgumentNullException();
            if (b == null) throw new ArgumentNullException();
            return new ImperialDistance(a._inches * b._inches);
        }
    
        public static ImperialDistance operator /(ImperialDistance a, ImperialDistance b)
        {
            if (a == null) throw new ArgumentNullException();
            if (b == null) throw new ArgumentNullException();
            return new ImperialDistance(a._inches / b._inches);
        }
    }
    

    And here's a metric class with meters as the base unit:

    public class MetricDistance
    {
        public static readonly MetricDistance Milimeter  = new MetricDistance(0.001);
        public static readonly MetricDistance Centimeter = new MetricDistance(0.01);
        public static readonly MetricDistance Decimeter  = new MetricDistance(0.1);
        public static readonly MetricDistance Meter      = new MetricDistance(1.0);
        public static readonly MetricDistance Decameter  = new MetricDistance(10.0);
        public static readonly MetricDistance Hectometer = new MetricDistance(100.0);
        public static readonly MetricDistance Kilometer  = new MetricDistance(1000.0);
    
        private double _meters;
    
        public MetricDistance(double meters)
        {
            _meters = meters;
        }
    
        public double ToMilimeters()
        {
            return _meters / Milimeter._meters;
        }
    
        public double ToCentimeters()
        {
            return _meters / Centimeter._meters;
        }
    
        public double ToDecimeters()
        {
            return _meters / Decimeter._meters;
        }
    
        public double ToMeters()
        {
            return _meters;
        }
    
        public double ToDecameters()
        {
            return _meters / Decameter._meters;
        }
    
        public double ToHectometers()
        {
            return _meters / Hectometer._meters;
        }
    
        public double ToKilometers()
        {
            return _meters / Kilometer._meters;
        }
    
        public ImperialDistance ToImperialDistance()
        {
            return new ImperialDistance(_meters * 39.3701);
        }
    
        public override int GetHashCode()
        {
            return _meters.GetHashCode();
        }
    
        public override bool Equals(object obj)
        {
            var o = obj as MetricDistance;
            if (o == null) return false;
            return _meters.Equals(o._meters);
        }
    
        public static bool operator ==(MetricDistance a, MetricDistance b)
        {
            // If both are null, or both are same instance, return true
            if (ReferenceEquals(a, b)) return true;
    
            // if either one or the other are null, return false
            if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) return false;
    
            return a._meters == b._meters;
        }
    
        public static bool operator !=(MetricDistance a, MetricDistance b)
        {
            return !(a == b);
        }
    
        public static MetricDistance operator +(MetricDistance a, MetricDistance b)
        {
            if (a == null) throw new ArgumentNullException("a");
            if (b == null) throw new ArgumentNullException("b");
            return new MetricDistance(a._meters + b._meters);
        }
    
        public static MetricDistance operator -(MetricDistance a, MetricDistance b)
        {
            if (a == null) throw new ArgumentNullException("a");
            if (b == null) throw new ArgumentNullException("b");
            return new MetricDistance(a._meters - b._meters);
        }
    
        public static MetricDistance operator *(MetricDistance a, MetricDistance b)
        {
            if (a == null) throw new ArgumentNullException("a");
            if (b == null) throw new ArgumentNullException("b");
            return new MetricDistance(a._meters * b._meters);
        }
    
        public static MetricDistance operator /(MetricDistance a, MetricDistance b)
        {
            if (a == null) throw new ArgumentNullException("a");
            if (b == null) throw new ArgumentNullException("b");
            return new MetricDistance(a._meters / b._meters);
        }
    }
    

    And here's a test method that exemplifies the usage.

    [TestMethod]
    public void _5in_Equals_12_7cm()
    {
        var inches = new ImperialDistance(5);
        var cms = new MetricDistance(MetricDistance.Centimeter.ToMeters() * 12.7);
        var calcCentimeters = Math.Round(inches.ToMetricDistance().ToCentimeters(), 2, MidpointRounding.AwayFromZero);
        var calcInches = Math.Round(cms.ToImperialDistance().ToInches(), 2, MidpointRounding.AwayFromZero);
    
        Assert.AreEqual(cms.ToCentimeters(), 12.7);
        Assert.AreEqual(calcCentimeters, 12.7);
        Assert.AreEqual(inches.ToInches(), 5);
        Assert.AreEqual(calcInches, 5);
    }
    

    You can also add extension methods:

    public static MetricDistance Centimeters(this Int32 that)
    {
        return new MetricDistance(MetricDistance.Centimeter.ToMeters() * that);
    }
    
    [TestMethod]
    public void _100cm_plus_300cm_equals_400cm()
    {
        Assert.AreEqual(100.Centimeters() + 300.Centimeters(), 400.Centimeters());
    }
    

    You can use this simple strategy for weights, temperatures, liquid measures, etc.

    0 讨论(0)
  • 2021-01-04 08:08

    No there is nothing like that built-in. But you can simply multiply or divide by 25.4.

    0 讨论(0)
  • 2021-01-04 08:09

    .NET Framework doesn't have anything like this, but F# does Units of Measure.

    0 讨论(0)
提交回复
热议问题