diff --git a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs index 1aadb5ad13018291a9b2400db2c3d144431c5107..b73e64854740a3a31821eb9426fb4af0341e0a54 100644 --- a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs +++ b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs @@ -268,6 +268,20 @@ namespace TUGraz.VectoCommon.Utils decimals = decimals ?? 2; return self.ToString("F" + decimals.Value); } + + //[DebuggerStepThrough] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string ToMinSignificantDigits(this double self, uint? significant = null, uint? decimals = null) + { + significant = significant ?? 3; + decimals = decimals ?? 1; + var scale = Math.Ceiling(Math.Log10(Math.Abs(self))); + + if (double.IsInfinity(scale) || double.IsNaN(scale)) + return self.ToString("F" + decimals.Value); + + return self.ToString("F" + Math.Max(significant.Value - scale, decimals.Value)); + } } public static class FloatExtensionMethods diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index f13905e10b14f272e317d0e2c5bae3d2e34b1d66..2c3f417a6220e42bcc2f4c20277904e3cab5662a 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -155,43 +155,44 @@ namespace TUGraz.VectoCore.OutputData.XML var retVal = new List<XElement>(); //FC retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).ToXMLFormat(1))); + (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value() + .ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/t-km"), (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / - result.Payload.ConvertTo().Ton).ToXMLFormat(1))); + result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) - .ToXMLFormat(1))); + (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value() + .ToMinSignificantDigits(3, 1))); if (fullOutput) { retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/km"), - (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6) - .ToXMLFormat(1))); + (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6).Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/t-km"), (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6) - .ToXMLFormat(1))); + .Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/m³-km"), - (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).ToXMLFormat(1))); + (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value() + .ToMinSignificantDigits(3, 1))); } if (fuel.FuelDensity != null) { retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/100km"), (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter * 100) - .ToXMLFormat(1))); + .Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/t-km"), (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / - result.Payload.ConvertTo().Ton).ToXMLFormat(1))); + result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/m³-km"), (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / - result.CargoVolume).ToXMLFormat(1))); + result.CargoVolume).Value().ToMinSignificantDigits(3, 1))); } //CO2 retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/km"), - (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).ToXMLFormat(1))); + (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/t-km"), (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / - result.Payload.ConvertTo().Ton).ToXMLFormat(1))); + result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"), - (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) - .ToXMLFormat(1))); + (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value() + .ToMinSignificantDigits(3, 1))); return retVal; } diff --git a/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs b/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs index cd1502d53ee8f9a1749c7c9b9b067ba795d39486..2258319d5ea7aa5069f88c49a62fbd95ee7144f0 100644 --- a/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs +++ b/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs @@ -103,5 +103,27 @@ namespace TUGraz.VectoCore.Tests.Utils Assert.IsTrue(0.999.IsSmallerOrEqual(1.0)); Assert.IsTrue(0.998.IsSmallerOrEqual(1.0)); } + + [TestMethod] + public void TestStringFormatting() + { + Assert.AreEqual("0.452", 0.452345.ToMinSignificantDigits(3, 1)); + Assert.AreEqual("4.52", 4.52345.ToMinSignificantDigits(3, 1)); + Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1)); + + Assert.AreEqual("0.0452", 0.0452345.ToMinSignificantDigits(3, 1)); + Assert.AreEqual("0.00452", 0.00452345.ToMinSignificantDigits(3, 1)); + + + Assert.AreEqual("-0.452", (-0.452345).ToMinSignificantDigits(3, 1)); + Assert.AreEqual("-4.52", (-4.52345).ToMinSignificantDigits(3, 1)); + Assert.AreEqual("-45.2", (-45.2345).ToMinSignificantDigits(3, 1)); + + Assert.AreEqual("-0.0452", (-0.0452345).ToMinSignificantDigits(3, 1)); + Assert.AreEqual("-0.00452", (-0.00452345).ToMinSignificantDigits(3, 1)); + + Assert.AreEqual("0.0", 0.0.ToMinSignificantDigits(3, 1)); + //Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1)); + } } } \ No newline at end of file