将基础 int 显示为定点小数的高效且正确的方法

本文关键字:高效 方法 小数 int 显示 | 更新日期: 2023-09-27 18:31:53

我正在使用一个系统,它为我提供了一个代表 1/10° 摄氏度的int值。 我想将其格式化为以°C为单位的字符串以显示给用户。 基本上是一个转换的函数:

int temperature = 2000; // => "200.0"

是否有内置方法可以实现此目的? 我当前的实现如下所示:

    private string ConvertToFixedDecimalString(int value, int factorOfTen)
    {
        var valueString = value.ToString(NumberFormatInfo.CurrentInfo);
        if (Math.Abs(factorOfTen) > valueString.Length)
        {
            valueString = valueString.PadLeft(Math.Abs(factorOfTen) - valueString.Length, '0');
            valueString = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator + valueString;
        }
        else if (factorOfTen > 0)
        {
            valueString = valueString.PadRight(factorOfTen, '0');
        }
        else
        {
            valueString = valueString.Insert(valueString.Length + factorOfTen,
                                             NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
        }
        return valueString;
    }

用作:

ConvertToFixedDecimalString(200, -1); // => "20.0"
ConvertToFixedDecimalString(200, -4); // => ".0200"
ConvertToFixedDecimalString(200, 1); // => "2000"

等等...但这似乎不优雅,如果我获得具有组分隔符的数字格式信息,可能会导致问题。

此外,我试图避免通过除法转换为double,因为在一般情况下,基础int值是精确的(来自测量设备),我不想在显示器中引入精度误差。

将基础 int 显示为定点小数的高效且正确的方法

试试这个。

public string ConvertToFixedDecimalString(int value, int factorOfTen)
{
    return (value * (decimal)Math.Pow(10, factorOfTen)).ToString();
}