Double to String,尽可能少的小数,至少四个

时间:2015-11-24 18:25:47

标签: c#

我有一个返回double值的函数。

如何取整数部分加小数部分,但如果它在第四个小数位后面,则删除右边的零和另一个数字?

21.879653    // 21.8796
21.000000    // 21
21.020000    // 21.02

我尝试使用正则表达式:

Regex.Replace(
    Regex.Match(result.ToString(), @"^\d+(?:\.\d{4})?").Value,
    @"0*$", "");

但我没有运气......而且我确定这不是正则表达式的任务。

其他想法?

3 个答案:

答案 0 :(得分:3)

您可以使用标准.NET Numeric Format Strings:

,而不是icky字符串操作
  

<强> “#”
  数字占位符
  将“#”符号替换为相应的数字(如果存在);否则,结果字符串中不会出现数字。

pwd

https://dotnetfiddle.net/n9xrfU

小数点前的格式说明符为#0,表示将显示至少一个数字。

答案 1 :(得分:0)

您可以使用Math.Truncate删除不需要的数字。如果您只想要4位数字:

double d = 21.879653;
double d2 = Math.Truncate(d * 10000) / 10000;

Console.WriteLine(d2.ToString("#.####"));

答案 2 :(得分:0)

试试这个。它没有写任何零。

internal class Program
{
    static void Main()
    {
        double d = 21.8786;
        double d1 = 21.000;
        double d2 = 21.02000;
        double d3 = 0;

        WriteNameAndValue(nameof(d), d.FormatDoubleToFourPlaces());
        WriteNameAndValue(nameof(d1), d1.FormatDoubleToFourPlaces());
        WriteNameAndValue(nameof(d2), d2.FormatDoubleToFourPlaces());
        WriteNameAndValue(nameof(d3), d3.FormatDoubleToFourPlaces());

    }

    static void WriteNameAndValue(string name, string value)
    {
        Console.WriteLine($"Name:  {name}\tValue: {value}");
    }


}

 static class DoubleHelper
{
    public static string FormatDoubleToFourPlaces(this double d, CultureInfo ci = null)
    {
        const int decimalPlaces = 4;


        if (double.IsInfinity(d) || double.IsNaN(d))
        {
            var ex = new ArgumentOutOfRangeException(nameof(d), d, "Must not be NaN or infinity");
            throw ex;
        }
        decimal decimalVersion = Convert.ToDecimal(d);
        if (decimalVersion == 0)
        {
            return string.Empty;
        }

        int integerVersion = Convert.ToInt32(Math.Truncate(decimalVersion));
        if (integerVersion == decimalVersion)
        {
            return integerVersion.ToString();
        }
        decimal scaleFactor = Convert.ToDecimal(Math.Pow(10.0, decimalPlaces));

        decimal scaledUp = decimalVersion*scaleFactor;
        decimal truncatedScaledUp = Math.Truncate(scaledUp);

        decimal resultingVersion = truncatedScaledUp/scaleFactor;

        return resultingVersion.ToString(ci ?? CultureInfo.InvariantCulture);

    }
}