【问题标题】:Why do I get a FormatException when converting a string to a float?为什么将字符串转换为浮点数时会出现 FormatException?
【发布时间】:2011-04-08 09:11:55
【问题描述】:

当我尝试将字符串转换为浮点数时:

Console.WriteLine(float.Parse("6.59"));

它抛出一个异常:

未处理的异常:System.FormatException:输入字符串不是正确的 f 格式。
在 System.Number.ParseSingle(字符串值,NumberStyles 选项,NumberFormat 信息 numfmt)

当我这样尝试时:

Console.WriteLine(Convert.ToSingle("6.59"));

它抛出相同的异常:

未处理的异常:System.FormatException:输入字符串不是正确的 f 格式。
在 System.Number.ParseSingle(字符串值,NumberStyles 选项,NumberFormat 信息 numfmt)
在 System.Convert.ToSingle(字符串值)

你能解释一下为什么会这样吗?

【问题讨论】:

  • 您是否尝试过将代码分解为单独的行并在调试器上单步执行?

标签: c# string exception floating-point


【解决方案1】:

单参数 Parse 方法使用当前区域性来解析字符串。如果您当前的文化使用其他小数分隔符,这将失败。

尝试使用不变的文化:

float.Parse("6.59", CultureInfo.InvariantCulture)

【讨论】:

  • +1 这个有用的提示,我的代码在我的开发环境中运行,但不在生产环境中。
【解决方案2】:

这里的问题是你的文化。

或者像这样设置不变的文化:

float.Parse("6.59", CultureInfo.InvariantCulture)

或为您的文化使用正确的小数分隔符

float.Parse("6,59")

我想知道您为什么使用文字字符串。如果您在输入文字浮点数时遇到问题,可以使用

Console.WriteLine(6.59f)

如果您这样做,文化就无关紧要,因为值是在编译时决定的。

【讨论】:

  • 英国也是欧洲! (我假设文字字符串是试图找到“重现问题的最简单代码”的结果)。
  • 该死的英制单位!去公制! (开个玩笑)我忘了英国仍然使用英制 :) 但我的观点仍然存在,如果他要将字符串文字放入 float.Parse 他做错了。
【解决方案3】:

您可能正在使用将, 作为小数分隔符的文化。

您可以尝试使用InvariantCulture Parse

float.Parse("6.59", CultureInfo.InvariantCulture)

【讨论】:

    【解决方案4】:

    文化 - 特定的事物。你的默认文化是什么? 一些文化使用“,”而不是“。”。你可以试试这个:

    float.Parse("6.59", CultureInfo.InvariantCulture);
    

    【讨论】:

      【解决方案5】:

      语言环境/文化可能存在问题。您需要为小数点分隔符设置, 而不是.

      【讨论】:

      • 葡萄牙语更糟糕。这里. 是数字组分隔符(又名千位分隔符)。因为这个float.Parse("6.59")没有失败,但是结果是659。这在过去浪费了我几个小时:(
      【解决方案6】:

      我知道这里的每个人都已经给出了遇到问题的原因,但也许有人应该详细说明 Invariant 修复它的原因。

      CultureInfo 类直接或间接由格式化、解析或操作特定于文化的数据的类使用,例如 String、DateTime、DateTimeOffset 和数字类型,以处理不同文化编写这些数据的方式的差异类型。

      如果是十进制类型,一些文化使用句点 (.),而其他文化使用逗号 (,)。默认情况下,当您使用转换库时,它将使用您的本地文化(即您的操作系统配置的国家/地区)。

      通过指定 Invariant,您表示您希望千位分隔符为逗号 (,),而十进制分隔符为句点 (.),这在大多数文化中都是如此。

      有时会发生的一个大问题是,从操作系统的角度来看,这些文化惯例会发生变化。例如,南非 (ZA) 文化信息曾经表现得像不变文化。 Microsoft 在 Windows 8 中改变了这一点,其中小数突然变成了逗号,千位分隔符变成了空格。这导致许多用 .Net 编写的旧系统在迁移到更新的操作系统时突然崩溃。

      最后,将所有本地文化信息规范化为不变,并以这种格式在您的业务逻辑中持久化和处理它们。然后将其本地化回前端。 DateTime 也是如此,尽快转换为 UTC,并且仅在渲染输出时返回。

      【讨论】:

        【解决方案7】:

        您也可以尝试使用 Convert 类来执行此任务。

        Convert.ToDecimal("6.59");

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多