C# - 使用NumberFormatInfo和Convert.ToDouble返回double

时间:2018-02-22 14:07:34

标签: c# globalization

在我的应用程序中,我有国际化,所以我们有一堆方法来处理格式化。 其中一个应该收到一个double并将其格式化为两位小数并返回 double 。为此,我们根据所选择的文化使用NumberFormatInfo

问题是我无法以Convert.ToDouble的方式使用NumberFormatInfo。基本上我想知道的是为什么:

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        var myDouble = 9.983743;

        var nfi = new NumberFormatInfo() {
            NumberDecimalDigits = 2
        };

        Console.WriteLine("Original value: " + myDouble);
        Console.WriteLine("Converted value: " + Convert.ToDouble(myDouble, nfi));
    }
}

打印

Original value: 9.983743
Converted value: 9.983743 // Should be 9.98

如果可能的话,如何才能使用NumberFormatInfo得到我想要的结果。

谢谢,

3 个答案:

答案 0 :(得分:4)

来自MSDN

  

NumberDecimalDigits属性与" F"一起使用。和" N"数字格式化操作中没有精度说明符的标准格式字符串。

默认为通用格式(G)。所以这会给你想要的结果:

Console.WriteLine(myDouble.ToString("N", nfi));

但是,无论如何,2是默认值。最好明确指定它:

Console.WriteLine(myDouble.ToString("N2", NumberFormatInfo.InvariantInfo));

<强>更新

  

是的,但我确实需要从我的方法中返回一个双倍。

现在我明白了。在你的位置,我也会返回原来的double。如果您的API的消费者希望将其显示/存储为具有两位数的字符串,则他有责任对其进行格式化。

如果你真的想省略精度的最后几位并返回修改后的值,那么请改用Math.Round(但我不建议这样做)。

答案 1 :(得分:0)

您声明要返回double ,小数点后只有2位数。因此,您不是格式化 rounding

Math.Round(myDouble, 2)
  

9.98

答案 2 :(得分:0)

将double转换为double不会改变任何内容,double总是双精度,不能更改小数位数。

double没有格式,当你使用Taffer解释的ToString()方法显示double时,格式会起作用。

你可以将它向下舍入以设置前2到0之后的所有数字,但是你不能删除数字。