¿.NET tiene unidades de clase de conversión? Necesito convertir pulgadas a milímetros y viceversa..NET units class, pulgadas a milímetros
Respuesta
No, no hay nada como eso incorporado. Pero puedes simplemente multiplicar o dividir por 25.4.
No, no hay tales conversiones de unidades integradas en el marco. Sin embargo, debería ser lo suficientemente fácil de implementarse usted mismo.
No, tiene que hacer uno mismo, de esta manera:
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; } }
}
.NET Framework no tiene nada como esto, pero lo hace F # Units of Measure.
Csunits es una buena biblioteca de unidades de medida para C#, consulte https://github.com/cureos/csunits. Actualmente está orientado a la radioterapia, pero puede agregar fácilmente sus propias unidades y cantidades.
He tratado este problema con anterioridad. Recomiendo hacer dos clases de distancia. Uno que tiene las medidas imperiales y otro que tiene las medidas métricas. Luego, puede convertir entre ellos fácilmente, con la obvia advertencia de que pierde precisión cuando lo hace.
Aquí hay un ejemplo de una clase de distancia imperial, con pulgadas como la unidad base de medida.
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);
}
}
Y aquí es una clase métrica con metros como la unidad base:
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);
}
}
Y aquí es un método de prueba que ejemplifica el uso.
[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);
}
También puede agregar métodos de extensión
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());
}
Puede utilizar esta sencilla estrategia de pesos, temperaturas, medidas de líquidos, etc.
Tanto 'MetricDistance' como' ImperialDistance' realmente deberían ser estructuras. – Georg
Esa es una opción, seguro. – mattmc3
[UnitsNet] (https://nuget.org/packages/UnitsNet) nuget tiene un enfoque similar, pero cubre una amplia gama de cantidades y unidades. – angularsen
- 1. .NET Guard Class Library?
- 2. .NET 4 Task Class Tutorial
- 3. .NET Class Loader - ¿Qué es?
- 4. ¿Puedo acceder a My Custom .NET Class desde PowerShell?
- 5. Convertir píxeles a pulgadas y viceversa en C#
- 6. A Repository Factory Class
- 7. ASP.NET Cache class vs. MemoryCache class
- 8. cómo establecer el tamaño de fuente LaTeX en milímetros?
- 9. Conversión de .class al frasco y .class a exe
- 10. Llamando a Parent Class Methods
- 11. ¿Puede .NET XmlSerializer class deserialize InnerXml como una cadena?
- 12. iPhone: Cambiar la velocidad de reproducción de Audio Units
- 13. .NET TransactionScope class y T-SQL TRAN COMMIT y ROLLBACK
- 14. ¿Cómo hacer que el código de la tableta de 10 pulgadas compatible con la tableta de 7 pulgadas androide en
- 15. Forcing class load
- 16. UserControls in Class Library
- 17. ¿Por qué "[self class] == [super class]"?
- 18. Imprimir en .NET - Conversión de milímetro a píxel
- 19. cocos2d iphone 5 Soporte de pantalla de 4 pulgadas
- 20. ¿Qué significa la plantilla <class key, class type> mean before a method in C++?
- 21. jquery add remove class
- 22. Class Documentation Suggestions
- 23. CSS: #id .class VS .class performance. ¿Cual es mejor?
- 24. Perl class naming convention
- 25. jQuery: si class = active?
- 26. ¿Cuáles son las unidades de distancia en com.vividsolutions.jts.geom.Geometry class?
- 27. C# Url Builder Class
- 28. Java Class File Editor
- 29. Inaccessible base class
- 30. ConfigurationManager & Static Class
¿Qué pasa con '*' y '/'? – Bobby
No hay nada malo, pero si hay tales clases, ¿por qué debería inventar la rueda otra vez;) – Tomas