.NET单位类,英寸到毫米

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

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

我以前处理过这个问题。 我建议为距离制作两个class级。 一个具有帝国措施,一个具有度量衡量标准。 然后,您可以轻松地在它们之间来回转换,明显的警告是,当您这样做时,您将失去精确度。

这是一个英制距离等级的例子,以英寸为基本测量单位。

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

您可以将这个简单的策略用于重量,温度,液体测量等。

.NET Framework没有这样的东西,但F#做了计量单位 。

不,框架中没有内置的单位转换。 但是,应该很容易实现自己。

Csunits是一个很好的C#测量单位库,请参阅https://github.com/cureos/csunits 。 它目前面向放射治疗,但您可以轻松添加自己的单位和数量。

不,你需要自己制作一个,像这样:

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

几年后,有很多Nuget包可以解决这个问题。 其中一个是https://github.com/angularsen/UnitsNet ,它能够处理你想要的东西。

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

它还支持很多其他东西。