float.Parse()不能按我想要的方式工作

Iva*_*nov 12 c#

我有一个文本文件,我用它来输入信息到我的应用程序.问题是一些值是浮点数,有时它们是空的,这就是我得到一个例外的原因.

        var s = "0.0";
        var f = float.Parse(s);
Run Code Online (Sandbox Code Playgroud)

上面的代码在第2行抛出异常"输入字符串的格式不正确."

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

我如何解析"0.0"?

ina*_*ruk 27

点符号"." 不用作分隔符(这取决于文化设置).因此,如果您想要绝对确定正确解析了点,您需要编写如下内容:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
ci.NumberFormat.CurrencyDecimalSeparator = ".";
avarage = double.Parse("0.0",NumberStyles.Any,ci);
Run Code Online (Sandbox Code Playgroud)

  • CultureInfo.InvariantCulture更好.(见下文) (2认同)

Ric*_*ard 7

您可以先检查null或空字符串.

您还可以使用Parse(甚至使用TryParse)重载之一来提供更具体的控制.

例如,使用不变文化进行检查,以避免使用非用户可见数据(例如来自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
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*ter 5

以下为我工作:

string stringVal = "0.0";
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat);
Run Code Online (Sandbox Code Playgroud)

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

float floatVal = 0.0f;
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat);
Run Code Online (Sandbox Code Playgroud)