2011-05-17 94 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

相關問題