213 lines
7.0 KiB
213 lines
7.0 KiB
using BrilliantSightClient.Model.Attributes; |
|
using BrilliantSightClient.Model.Extension; |
|
using BrilliantSightClient.Model.GradeResult.Entity.Enums; |
|
|
|
namespace BrilliantSightClient.Model.GradeResult.Helper; |
|
/// <summary> |
|
/// 数据格式化工具类 |
|
/// </summary> |
|
public static class DoubleDataFormatHelper |
|
{ |
|
/// <summary> |
|
/// 格式为小数点后一位 |
|
/// </summary> |
|
public const string DigitsFormat = "f1"; |
|
|
|
/// <summary> |
|
/// 直径的小数格式化 |
|
/// </summary> |
|
/// <param name="value"></param> |
|
/// <returns></returns> |
|
[Log] |
|
public static string FormatDouble_D(double value) |
|
{ |
|
// 2025/03/28 维护阶段发现直径切舍为四舍五入,现在改成直接切割 |
|
//return value.ToString("f2"); |
|
return (Math.Floor(value*100)/100).ToString("f2"); |
|
} |
|
/// <summary> |
|
/// 百分比用的小数格式化 |
|
/// </summary> |
|
/// <param name="value"></param> |
|
/// <returns></returns> |
|
[Log] |
|
public static string FormatDouble_P(double value) |
|
{ |
|
return (Math.Floor(value*1000)/10).ToString(DigitsFormat); |
|
} |
|
|
|
|
|
[Log] |
|
public static string FormatDouble_P2(double value) |
|
{ |
|
return (Math.Floor(value * 10000) / 100).ToString("f2"); |
|
} |
|
|
|
/// <summary> |
|
/// 百分比用的小数格式化 |
|
/// </summary> |
|
/// <param name="value"></param> |
|
/// <returns></returns> |
|
[Log] |
|
public static string FormatDouble_Avg(double value, Accuracy accuracy) |
|
{ |
|
string result = ""; |
|
if (Model.Helper.Common.RunMode == 0) |
|
{ |
|
switch (accuracy) |
|
{ |
|
case Accuracy.ForceTwoDecimals: |
|
result = (Math.Floor(value * 100) / 100).ToString("f2"); |
|
break; |
|
case Accuracy.ForceOneDecimal: |
|
result = (Math.Floor(value * 10) / 10).ToString("f1"); |
|
break; |
|
case Accuracy.HalfStepRounding: |
|
result = (RoundFiveDownSixUp(value * 2) / 2).ToString("f1"); |
|
break; |
|
case Accuracy.MultipleOfFive: |
|
result = (RoundFiveDownSixUp(value / 5) * 5).ToString(); |
|
break; |
|
case Accuracy.DecimalTwoStepRounding: |
|
result = RoundToPointTwo(value).ToString("f1"); // 保留1位小数 |
|
break; |
|
case Accuracy.IntegerFloor: |
|
result = Math.Floor(value).ToString("F1"); // 直接取整 |
|
break; |
|
} |
|
} |
|
else |
|
{ |
|
//工厂模式不量化 |
|
switch (accuracy) |
|
{ |
|
case Accuracy.ForceTwoDecimals: |
|
result = (Math.Floor(value * 100) / 100).ToString("f2"); |
|
break; |
|
case Accuracy.HalfStepRounding: |
|
case Accuracy.ForceOneDecimal: |
|
case Accuracy.DecimalTwoStepRounding: |
|
case Accuracy.IntegerFloor: |
|
case Accuracy.MultipleOfFive: |
|
result = (Math.Floor(value * 10) / 10).ToString("f1"); |
|
break; |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
/// <summary> |
|
/// 百分比用的小数格式化 |
|
/// </summary> |
|
/// <param name="value"></param> |
|
/// <returns></returns> |
|
[Log] |
|
public static string FormatDouble(object? value, Accuracy accuracy) |
|
{ |
|
string result = ""; |
|
|
|
double dvalue = Double.NaN; |
|
if (!Double.TryParse(value.ToSafeString(), out dvalue)) |
|
{ |
|
return string.Empty; |
|
} |
|
|
|
if (Model.Helper.Common.RunMode == 0) |
|
{ |
|
switch (accuracy) |
|
{ |
|
case Accuracy.ForceTwoDecimals: |
|
result = (Math.Floor(dvalue * 100) / 100).ToString("f2"); |
|
break; |
|
case Accuracy.ForceOneDecimal: |
|
result = (Math.Floor(dvalue * 10) / 10).ToString("f1"); |
|
break; |
|
case Accuracy.HalfStepRounding: |
|
result = (RoundFiveDownSixUp(dvalue * 2) / 2).ToString("f1"); |
|
break; |
|
case Accuracy.MultipleOfFive: |
|
result = (RoundFiveDownSixUp(dvalue / 5) * 5).ToString(); |
|
break; |
|
case Accuracy.DecimalTwoStepRounding: |
|
result = RoundToPointTwo(dvalue).ToString("f1"); // 保留1位小数 |
|
break; |
|
case Accuracy.IntegerFloor: |
|
result = Math.Floor(dvalue).ToString("F1"); // 直接取整 |
|
break; |
|
} |
|
} |
|
else |
|
{ |
|
//工厂模式不量化 |
|
switch (accuracy) |
|
{ |
|
case Accuracy.ForceTwoDecimals: |
|
result = (Math.Floor(dvalue * 100) / 100).ToString("f2"); |
|
break; |
|
case Accuracy.HalfStepRounding: |
|
case Accuracy.ForceOneDecimal: |
|
case Accuracy.DecimalTwoStepRounding: |
|
case Accuracy.IntegerFloor: |
|
case Accuracy.MultipleOfFive: |
|
result = (Math.Floor(dvalue * 10) / 10).ToString("f1"); |
|
break; |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
[Log] |
|
public static double RoundFiveDownSixUp(double value) |
|
{ |
|
// 提取整数部分 |
|
double integerPart = Math.Truncate(value); |
|
// 提取小数部分 |
|
double fractionalPart = value - integerPart; |
|
|
|
// 判断小数部分是否大于 0.5 |
|
return fractionalPart > 0.5 ? integerPart + 1 : integerPart; |
|
} |
|
public static double RoundToPointTwo(double value) |
|
{ |
|
// 转换到10倍精度空间处理 |
|
double scaled = value * 10; |
|
double remainder = scaled % 2; // 求模得到余数 |
|
|
|
// 核心舍入规则:余数>=1.5时进位 |
|
return remainder >= 1.5 ? (scaled - remainder + 2) / 10 : (scaled - remainder) / 10; |
|
} |
|
|
|
/// <summary> |
|
/// 直接值(角度,直径)用的小数格式化 |
|
/// </summary> |
|
/// <param name="value"></param> |
|
/// <returns></returns> |
|
[Log] |
|
public static string FormatDouble_A(double value) |
|
{ |
|
return (Math.Floor(value * 10) / 10).ToString(DigitsFormat); |
|
} |
|
[Log] |
|
public static string FormatDouble_A2(double value) |
|
{ |
|
return (Math.Floor(value * 100) / 100).ToString("f2"); |
|
} |
|
public static Accuracy ToAccuracy(this string value) |
|
{ |
|
if (string.IsNullOrEmpty(value)) |
|
throw new ArgumentNullException(nameof(value), "输入值不能为空"); |
|
|
|
if (int.TryParse(value, out int numericValue)) |
|
{ |
|
if (Enum.IsDefined(typeof(Accuracy), numericValue)) |
|
return (Accuracy)numericValue; |
|
} |
|
|
|
// 尝试按名称转换(处理ForceTwoDecimals等情况) |
|
if (Enum.TryParse<Accuracy>(value, true, out var result)) |
|
return result; |
|
|
|
throw new ArgumentException($"无法将值 '{value}' 转换为有效的Accuracy枚举", nameof(value)); |
|
} |
|
|
|
} |