1

我有一个程序,它输出从 3rd 方应用程序接收的字符串值列表。

已提出要求最终用户希望看到所有小数精度级别保持在其设置的最高级别。由于每个新值都会覆盖最后一个值,因此无需向后应用,只需向前应用即可。

因此,如果它达到 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 个样本出现,所以这不会影响性能。事实上,如果确定这会导致应用程序明显变慢,则可能会放弃该要求。

    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;
    }

所以问题是任何人都可以想到更好/更快的方法吗?

此外,如果提供的工作解决方案有任何明显的问题,请随时指出。

4

1 回答 1

3

要从字符串中获取小数位数,请使用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);      
于 2012-08-14T13:17:44.063 回答