2011-05-17 155 views
9

.NET是否具有单位转换类?我需要将英寸转换为毫米,反之亦然。.NET单位类,英寸到毫米

+6

出了什么问题'*'和'/'? – Bobby 2011-05-17 07:37:27

+9

没有错,但如果有这样的类,为什么我应该再次发明车轮;) – Tomas 2011-05-17 07:39:01

回答

9

不,没有像内置的东西。但你可以简单地乘以或除以25.4。

2

不,没有这样的单位转换内置到框架。虽然应该很容易实现自己。

1

不,你需要自己做一个,这样的:

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; } } 
} 
9

我以前处理过这个问题。我建议为距离做两个类。一种具有帝国措施,另一种具有度量措施。然后,您可以轻松地在它们之间来回转换,但有一个明显的警告,那就是您在执行时失去了精度。

下面是以英寸为度量单位的英制距离等级的示例。

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); 
    } 
} 

而这里的度量类如米,基本单元:

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); 
    } 
} 

及这里的例证使用的测试方法。

[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); 
} 

您还可以添加扩展方法

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()); 
} 

您可以使用重量,温度,液体措施,这个简单的策略,等

+0

'MetricDistance'和'ImperialDistance'都应该是结构。 – Georg 2017-06-14 06:50:59

+0

这是一个选项,当然。 – mattmc3 2017-06-14 13:56:07

+0

[UnitsNet](https://nuget.org/packages/UnitsNet)nuget采取了类似的方法,但涵盖了大量的数量和单位。 – angularsen 2017-09-30 17:11:42

相关问题