1

サードパーティのアプリケーションから受け取った文字列値のリストを出力するプログラムがあります。

10 進精度のすべてのレベルを、設定されている最高レベルのままにしておきたいというエンド ユーザーの要望がありました。新しい値はそれぞれ最後の値を上書きするため、これを後方に適用する必要はなく、前方に適用するだけです。

したがって、精度が 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;
    }

問題は、これを行うためのより良い/より高速な方法を誰かが考えられるかということです?

また、提供されている実用的なソリューションに明らかな問題がある場合は、自由に指摘してください。

4

1 に答える 1

3

文字列から小数点以下の桁数を取得するには、次のようにしますIndexOf

var sep = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator; 
var pos = val.IndexOf(sep); 
var pre = (pos == -1) ? 0 : val.Length - pos - 1; 

10 進数型の使用から精度を取得するには、次のようにします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 に答える