C# 防止数字字符串值降低其十进制精度的更有效方法
我有一个程序,它输出从第三方应用程序接收的字符串值列表 已请求最终用户希望看到十进制精度的所有级别保持在其设置的最高级别。由于每个新值都会覆盖上一个值,因此无需向后应用,只需向前应用即可 因此,如果它达到3个精度级别,那么之后应该保持在该级别。 例如,如果收到的值为:1、15、15.2、4.25、1.111、3.4、1,则输出为: 1,15,15.2,4.25,1.111,3.400,1.000 我已经编写了下面的代码来完成这项工作,但对我来说,它似乎不是很优雅。性能在这里也非常重要,因为可能会有100个样本,所以这不会影响性能。事实上,如果确定这会导致应用程序明显减速,则该需求可能会被删除C# 防止数字字符串值降低其十进制精度的更有效方法,c#,.net,performance,C#,.net,Performance,我有一个程序,它输出从第三方应用程序接收的字符串值列表 已请求最终用户希望看到十进制精度的所有级别保持在其设置的最高级别。由于每个新值都会覆盖上一个值,因此无需向后应用,只需向前应用即可 因此,如果它达到3个精度级别,那么之后应该保持在该级别。 例如,如果收到的值为:1、15、15.2、4.25、1.111、3.4、1,则输出为: 1,15,15.2,4.25,1.111,3.400,1.000 我已经编写了下面的代码来完成这项工作,但对我来说,它似乎不是很优雅。性能在这里也非常重要,因为可能会
int numberOfDecimals = 0;
private string FormatValueToMinimumNumberOfDecimals(string value)
{
decimal doubleValue;
if (decimal.TryParse(value, out doubleValue))
{
int numberOfDecimals = this.CountDecimalPlace(doubleValue);
if (this.numberOfDecimals > numberOfDecimals)
{
value = doubleValue.ToString(String.Format("N{0}", this.numberOfDecimals.ToString()));
}
else
{
this.numberOfDecimals = numberOfDecimals;
}
}
return value;
}
private int CountDecimalPlace(decimal val)
{
int decimalCount = 0;
decimal ten = 10;
while (val != Math.Floor(val))
{
val *= ten;
decimalCount++;
}
return decimalCount;
}
所以问题是,有人能想出一种更好/更快的方法吗
此外,如果工作解决方案中存在任何明显的问题,请随时指出。要从字符串中获取小数位数,请使用
IndexOf
:
var sep = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
var pos = val.IndexOf(sep);
var pre = (pos == -1) ? 0 : val.Length - pos - 1;
要从十进制类型获取精度,请使用decimal.GetBits
:
var pre = (Decimal.GetBits(val)[3] >> 16) & 0x000000FF;
此外,还可以使用NumberFormatInfo代替String.Format()
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = this.numberOfDecimals;
value = doubleValue.ToString("N", nfi);