为什么在将字符串转换为float时会出现FormatException?

时间:2011-04-08 09:11:56

标签: c# string exception floating-point

当我尝试将字符串转换为float时:

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

它引发了异常:

  

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

当我这样尝试时:

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

它引发了同样的异常:

  

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

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

7 个答案:

答案 0 :(得分:35)

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

尝试使用不变文化:

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

答案 1 :(得分:4)

这里的问题是你的文化。

要么像这样设置不变文化:

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

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

float.Parse("6,59")

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

Console.WriteLine(6.59f)

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

答案 2 :(得分:3)

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

您可以尝试Parse使用InvariantCulture

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

答案 3 :(得分:2)

Locale / Culture可能存在问题。您需要为小数点分隔符设置,而不是.

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

我知道这里的每个人都已经解决了遇到问题的原因,但也许有人应该扩展为什么Invariant会修复它。

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

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

通过指定Invariant,您可以说您希望千位分隔符为逗号(,),并且十进制分隔符为大多数文化中的句点(。)。

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

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

答案 6 :(得分:0)

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

Convert.ToDecimal( “6.59”);