Skip to content

Commit

Permalink
[PTRun][UnitConverter]Preserve more significant digits (microsoft#35073)
Browse files Browse the repository at this point in the history
* [PTRun][UnitConverter]Preserve more significant digits

* Use StringComparison.OrdinalIgnoreCase
  • Loading branch information
PesBandi authored Oct 18, 2024
1 parent dd5cd2a commit e99b52f
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ public void HandlesParsecToNanometer()
var convertModel = new ConvertModel(1, "parsec", "nanometer");
var result = UnitHandler.Convert(convertModel).Single();
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
Assert.AreEqual(3.0857000000000004E+25, result.ConvertedValue);
Assert.AreEqual("3.0857e+25 nanometer", str);
Assert.AreEqual(3.08567758128E+25, result.ConvertedValue);
Assert.AreEqual("3.08567758128E+25 nanometer", str);
}

[TestMethod]
Expand All @@ -67,8 +67,8 @@ public void HandlesNanometerToParsec()
var convertModel = new ConvertModel(1, "nanometer", "parsec");
var result = UnitHandler.Convert(convertModel).Single();
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
Assert.AreEqual(3.2408000000000005E-26, result.ConvertedValue);
Assert.AreEqual("3.2408e-26 parsec", str);
Assert.AreEqual(3.240779289666357E-26, result.ConvertedValue);
Assert.AreEqual("3.2407792896664E-26 parsec", str);
}

[TestMethod]
Expand All @@ -79,46 +79,13 @@ public void HandleInvalidModel()
Assert.AreEqual(0, results.Count());
}

[TestMethod]
public void RoundZero()
{
double result = UnitHandler.Round(0.0);
Assert.AreEqual(0, result);
}

[TestMethod]
public void RoundNormalValue()
{
double result = UnitHandler.Round(3.141592653589793);
Assert.AreEqual(3.1416, result);
}

[TestMethod]
public void RoundSmallValue()
{
double result = UnitHandler.Round(1.23456789012345E-16);
Assert.AreEqual(1.2346E-16, result);
}

[TestMethod]
public void RoundBigValue()
{
double result = UnitHandler.Round(1234567890123456.0);
Assert.AreEqual(1234600000000000.0, result);
}

[TestMethod]
public void RoundNegativeValue()
{
double result = UnitHandler.Round(-3.141592653589793);
Assert.AreEqual(-3.1416, result);
}

[TestMethod]
public void RoundNinesValue()
{
double result = UnitHandler.Round(999999999999.9998);
Assert.AreEqual(1000000000000.0, result);
var convertModel = new ConvertModel(3.14159265358979323, "stone", "kg");
var result = UnitHandler.Convert(convertModel).Single();
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
Assert.AreEqual("19.950018128979… kg", str);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ private Result GetResult(UnitConversionResult result)
{
try
{
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.Format, CultureInfo.CurrentCulture));
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.CopyFormat, CultureInfo.CurrentCulture));
ret = true;
}
catch (ExternalException)
Expand Down Expand Up @@ -104,7 +104,7 @@ private ContextMenuResult CreateContextMenuEntry(UnitConversionResult result)
{
try
{
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.Format, CultureInfo.CurrentCulture));
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.CopyFormat, CultureInfo.CurrentCulture));
ret = true;
}
catch (ExternalException)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using UnitsNet;

namespace Community.PowerToys.Run.Plugin.UnitConverter
{
public class UnitConversionResult
{
public static string Format { get; set; } = "g14";
public static string TitleFormat { get; set; } = "G14";

public static string CopyFormat { get; set; } = "R";

public double ConvertedValue { get; }

Expand All @@ -23,14 +26,25 @@ public UnitConversionResult(double convertedValue, string unitName, QuantityInfo
QuantityInfo = quantityInfo;
}

public string ToString(System.IFormatProvider provider = null)
public string ToString(IFormatProvider provider = null)
{
if (provider == null)
{
provider = System.Globalization.CultureInfo.CurrentCulture;
}

return ConvertedValue.ToString(Format, provider) + " " + UnitName;
// Check if the formatted number matches the original value. If they differ, some
// decimal places where cut off, and therefore we add an ellipsis.
string formatted = ConvertedValue.ToString(TitleFormat, provider);

if (double.TryParse(formatted, provider, out double parsedNumber) &&
Math.Abs(ConvertedValue - parsedNumber) > double.Epsilon &&
!formatted.Contains('E', StringComparison.OrdinalIgnoreCase))
{
return formatted + "… " + UnitName;
}

return formatted + " " + UnitName;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
{
public static class UnitHandler
{
private static readonly int _roundingSignificantDigits = 4;

private static readonly QuantityInfo[] _included = new QuantityInfo[]
{
Acceleration.Info,
Expand Down Expand Up @@ -59,23 +57,6 @@ private static Enum GetUnitEnum(string unit, QuantityInfo unitInfo)
return null;
}

/// <summary>
/// Rounds the value to the predefined number of significant digits.
/// </summary>
/// <param name="value">Value to be rounded</param>
public static double Round(double value)
{
if (value == 0.0D)
{
return 0;
}

var power = Math.Floor(Math.Log10(Math.Abs(value)));
var exponent = Math.Pow(10, power);
var rounded = Math.Round(value / exponent, _roundingSignificantDigits) * exponent;
return rounded;
}

/// <summary>
/// Given parsed ConvertModel, computes result. (E.g "1 foot in cm").
/// </summary>
Expand Down Expand Up @@ -106,7 +87,7 @@ public static IEnumerable<UnitConversionResult> Convert(ConvertModel convertMode

if (!double.IsNaN(convertedValue))
{
UnitConversionResult result = new UnitConversionResult(Round(convertedValue), convertModel.ToUnit, quantityInfo);
UnitConversionResult result = new UnitConversionResult(convertedValue, convertModel.ToUnit, quantityInfo);
results.Add(result);
}
}
Expand Down

0 comments on commit e99b52f

Please sign in to comment.