【问题标题】:C# - Using NumberFormatInfo with Convert.ToDouble to return doubleC# - 将 NumberFormatInfo 与 Convert.ToDouble 一起使用以返回双精度
【发布时间】:2018-02-22 14:07:33
【问题描述】:

在我的应用程序中,我有国际化,所以我们有很多方法来处理格式。 其中一个应该接收一个 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 获得我想要的结果。

谢谢,

【问题讨论】:

  • 这是因为将double 转换为double 不会改变double。您想要格式化double 的string 表示形式。那或实际上舍入或截断有问题的double。
  • 即使myDouble 是string,它仍然不会对数字进行四舍五入。那么基本上Convert.ToDouble方法中NumberFormatInfo参数的作用是什么?
  • 基本上NumberFormatInfo 既可用于将string 解析为数字,也可用于将数字格式化为string。所以它的一些设置仅用于这两种用途之一。
  • 在NumberFormatInfo 的参数中,我认为这是少数适用于double 的参数之一。其他的实际上只是关于呈现数字(货币符号、加号等)。那是一个婴儿潮一代:/谢谢!
  • 你看到我的回答了吗?我将向您展示如何将您的数字四舍五入到 2 位数。

标签: c# globalization


【解决方案1】:

来自MSDN:

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

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

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

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

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

更新:

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

现在我明白了。在这种情况下,我也会在您的位置返回原始的double。如果您的 API 的使用者想要将其显示/存储为具有两位数的字符串,那么他有责任对其进行格式化。

如果您确实想省略精度的最后一位并返回修改后的值,请改用Math.Round(但我不建议这样做)。

【讨论】:

  • 是的,但我确实需要从我的方法中返回一个double。该值返回给客户端并且应该是double。我只想依靠使用NumberFormatInfo 的单一方法(因为这是在用户选择应用程序语言时设置的),而不是将其转换为string,然后再转换为double...你觉得可能吗?
  • @JoãoMenighin 你把格式和操作搞混了。您基本上应该在系统中保留一个值,并且只担心显示时的格式。如果您确实需要对一个值进行四舍五入,那么您将使用适当的数学函数。
  • 我确实同意@taffer,我无法理解的一件事是NumberFormatInfo 参数在Convert.ToDouble 中的用途,如果不是这种“格式” ”。你知道吗?
  • 整个Convert 类非常适合将IConvertible 类型相互转换。所有原始类型都实现IConvertible,包括string。带有IFormatProvider 参数的Convert 方法仅在转换为string 或object 或从object 转换时使用(NumberFormatInfo 是IFormatProvider 的实现)。具体来说,Convert.ToDouble(string,IFormatProvider) 实际上是一个double.Parse() 调用。解析字符串时,文化相关的小数分隔符、千位分隔符、负号符号取自NumberFormatInfo。
【解决方案2】:

将双精度数转换为双精度数不会改变任何内容,双精度数始终是双精度,您无法更改小数位数。

双精度数没有格式,当您使用 taffer 解释的 ToString() 方法显示双精度数时,格式就会起作用。

您可以将其向下舍入以将前 2 之后的所有数字设置为零,但您不能删除数字。

【讨论】:

    【解决方案3】:

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

    Math.Round(myDouble, 2)
    

    9.98

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多