mirror of
https://github.com/microsoft/PowerToys.git
synced 2024-11-27 14:59:16 +08:00
[PTRun][UnitConverter]Preserve more significant digits (#35073)
* [PTRun][UnitConverter]Preserve more significant digits * Use StringComparison.OrdinalIgnoreCase
This commit is contained in:
parent
dd5cd2a570
commit
e99b52fb35
@ -57,8 +57,8 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest
|
|||||||
var convertModel = new ConvertModel(1, "parsec", "nanometer");
|
var convertModel = new ConvertModel(1, "parsec", "nanometer");
|
||||||
var result = UnitHandler.Convert(convertModel).Single();
|
var result = UnitHandler.Convert(convertModel).Single();
|
||||||
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||||
Assert.AreEqual(3.0857000000000004E+25, result.ConvertedValue);
|
Assert.AreEqual(3.08567758128E+25, result.ConvertedValue);
|
||||||
Assert.AreEqual("3.0857e+25 nanometer", str);
|
Assert.AreEqual("3.08567758128E+25 nanometer", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@ -67,8 +67,8 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest
|
|||||||
var convertModel = new ConvertModel(1, "nanometer", "parsec");
|
var convertModel = new ConvertModel(1, "nanometer", "parsec");
|
||||||
var result = UnitHandler.Convert(convertModel).Single();
|
var result = UnitHandler.Convert(convertModel).Single();
|
||||||
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||||
Assert.AreEqual(3.2408000000000005E-26, result.ConvertedValue);
|
Assert.AreEqual(3.240779289666357E-26, result.ConvertedValue);
|
||||||
Assert.AreEqual("3.2408e-26 parsec", str);
|
Assert.AreEqual("3.2407792896664E-26 parsec", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@ -79,46 +79,13 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest
|
|||||||
Assert.AreEqual(0, results.Count());
|
Assert.AreEqual(0, results.Count());
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void RoundZero()
|
|
||||||
{
|
|
||||||
double result = UnitHandler.Round(0.0);
|
|
||||||
Assert.AreEqual(0, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void RoundNormalValue()
|
public void RoundNormalValue()
|
||||||
{
|
{
|
||||||
double result = UnitHandler.Round(3.141592653589793);
|
var convertModel = new ConvertModel(3.14159265358979323, "stone", "kg");
|
||||||
Assert.AreEqual(3.1416, result);
|
var result = UnitHandler.Convert(convertModel).Single();
|
||||||
}
|
var str = result.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
Assert.AreEqual("19.950018128979… kg", str);
|
||||||
[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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.Format, CultureInfo.CurrentCulture));
|
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.CopyFormat, CultureInfo.CurrentCulture));
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
catch (ExternalException)
|
catch (ExternalException)
|
||||||
@ -104,7 +104,7 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.Format, CultureInfo.CurrentCulture));
|
Clipboard.SetText(result.ConvertedValue.ToString(UnitConversionResult.CopyFormat, CultureInfo.CurrentCulture));
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
catch (ExternalException)
|
catch (ExternalException)
|
||||||
|
@ -2,13 +2,16 @@
|
|||||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using UnitsNet;
|
using UnitsNet;
|
||||||
|
|
||||||
namespace Community.PowerToys.Run.Plugin.UnitConverter
|
namespace Community.PowerToys.Run.Plugin.UnitConverter
|
||||||
{
|
{
|
||||||
public class UnitConversionResult
|
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; }
|
public double ConvertedValue { get; }
|
||||||
|
|
||||||
@ -23,14 +26,25 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
|
|||||||
QuantityInfo = quantityInfo;
|
QuantityInfo = quantityInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ToString(System.IFormatProvider provider = null)
|
public string ToString(IFormatProvider provider = null)
|
||||||
{
|
{
|
||||||
if (provider == null)
|
if (provider == null)
|
||||||
{
|
{
|
||||||
provider = System.Globalization.CultureInfo.CurrentCulture;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,8 +11,6 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
|
|||||||
{
|
{
|
||||||
public static class UnitHandler
|
public static class UnitHandler
|
||||||
{
|
{
|
||||||
private static readonly int _roundingSignificantDigits = 4;
|
|
||||||
|
|
||||||
private static readonly QuantityInfo[] _included = new QuantityInfo[]
|
private static readonly QuantityInfo[] _included = new QuantityInfo[]
|
||||||
{
|
{
|
||||||
Acceleration.Info,
|
Acceleration.Info,
|
||||||
@ -59,23 +57,6 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
|
|||||||
return null;
|
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>
|
/// <summary>
|
||||||
/// Given parsed ConvertModel, computes result. (E.g "1 foot in cm").
|
/// Given parsed ConvertModel, computes result. (E.g "1 foot in cm").
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -106,7 +87,7 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter
|
|||||||
|
|
||||||
if (!double.IsNaN(convertedValue))
|
if (!double.IsNaN(convertedValue))
|
||||||
{
|
{
|
||||||
UnitConversionResult result = new UnitConversionResult(Round(convertedValue), convertModel.ToUnit, quantityInfo);
|
UnitConversionResult result = new UnitConversionResult(convertedValue, convertModel.ToUnit, quantityInfo);
|
||||||
results.Add(result);
|
results.Add(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user