2009-06-18 54 views
10

我有一个文本文件,我使用它将信息输入到我的应用程序中。问题是有些值是float,有时它们是null,这就是为什么我得到一个例外。float.Parse()不按我想要的方式工作

 var s = "0.0"; 
     var f = float.Parse(s); 

上面的代码在第2行引发异常“输入字符串的格式不正确”。

我相信解决方案将是float.Parse的高级重载,其中包括IFormatProvider作为参数,但我还不知道它的一切。

如何解析“0.0”?

+0

我试过你的代码了,我能够解析值罚款。 – 2009-06-18 18:58:51

+3

此代码依赖于文化(即依赖于区域设置)。所以我们有些人不会看到这种行为。 – inazaruk 2009-06-18 19:05:40

回答

22

点符号“。”不用作分隔符(这取决于文化设置)。所以,如果你想绝对确保点被正确解析,你需要写这样的事:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
2

我刚刚试过这个,它没有抛出任何异常。

您的数字格式是否使用小数点逗号而不是小数点?您是否尝试过:

var s = "0,0"; 
var f = float.Parse(s); 

经询问,这个我刚刚用逗号期待得到一个异常尝试过,但没有。所以这可能不是答案。

+0

可以使用正确的语言环境生成异常,例如英语。 – Akku 2012-01-16 14:38:51

+0

@Akku - 我不记得我做过的确切测试(我在2年前发布了这个答案),但我知道区域设置以及它们如何影响数字解析。我向用户建议*他的*语言环境设置为期望的十进制逗号而不是小数点。 – ChrisF 2012-01-16 14:46:00

2

或者,您可以简单地检查输入文本是否为空或空。

另外,要小心,因为在某些国家,“。” (点)分隔浮点数是“,”(逗号)

6

您可以检查null或空字符串第一。

您也可以使用Parse(或甚至使用TryParse)的重载之一来给出更具体的控制。

E.g.检查使用invarient培养,以避免与非用户可见数据小数点变化(例如从A2A通信):

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

我以下工作:

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

相反的情况(适用于所有coutries):

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
相关问题