【问题标题】:Double parse with culture format文化格式的双重解析
【发布时间】:2011-02-24 20:03:39
【问题描述】:

我有一个双数作为字符串。号码是

202.667,40

202667.4

我怎样才能解析这个字符串来得到这样的值:Double.Parse("202.667,40",?what here),或者任何其他获取值的方法都会很棒。谢谢

【问题讨论】:

  • 使用使用逗号作为小数点的区域性的 CultureInfo。以德国为例。最好匹配字符串来自的任何国家。

标签: c# int32


【解决方案1】:

首先,你需要知道这个数字来自哪个文化,然后:

CultureInfo culture = new CultureInfo("de"); // I'm assuming german here.
double number = Double.Parse("202.667,40", culture);

如果要使用当前线程文化进行解析,默认情况下是为当前用户设置的:

double number = Double.Parse("202.667,40", CultureInfo.CurrentCulture);

【讨论】:

  • 使用“de”会为我抛出 NotSupportedException。 “文化'de'是一种中性文化。它不能用于格式化和解析,因此不能设置为线程的当前文化。”也许你想要“de-DE”?
【解决方案2】:

我想我找到了一个不需要文化的解决方案。无论文化如何,使用 NumberFormatInfo 都可以强制使用格式:

// This is invariant
NumberFormatInfo format = new NumberFormatInfo();
// Set the 'splitter' for thousands
format.NumberGroupSeparator = ".";
// Set the decimal seperator
format.NumberDecimalSeparator = ",";

然后:

System.Diagnostics.Debug.WriteLine(double.Parse("202.667,40", format)));

输出:
202667,4

当然,这个输出(内部 toString())可能因 Culture(!)而异
请注意,将输入更改为“202,667.40”将导致解析错误,因此格式应与您的预期输入匹配。

希望这对某人有所帮助..

【讨论】:

    【解决方案3】:

    不必在所有解析中指定语言环境,我更喜欢设置应用程序范围的语言环境,尽管如果字符串格式在整个应用程序中不一致,这可能不起作用。

    CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-PT");
    CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("pt-PT");
    

    在您的应用程序开始时定义它将使所有双重解析都期望逗号作为小数分隔符。

    【讨论】:

    • 我在 xamarin 中遇到了大问题。这对我来说是工作。谢谢。
    【解决方案4】:

    您可以使用 Double.Parse(your_number, CultureInfo.CurrentCulture) 并使用 Thread.CurrentThread.CurrentCulture 相应地设置 CurrentCulture。

    例子:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
    

    后来

    Double.Parse(your_number, CultureInfo.CurrentCulture);
    

    请注意,如果您将区域性显式分配给 CurrentThread,则它仅适用于该线程。

    【讨论】:

      【解决方案5】:

      为了更灵活,您可以设置 NumberDecimalSeparator

      string number = "202.667,40";
      double.Parse(number.Replace(".", ""), new CultureInfo(CultureInfo.CurrentCulture.Name) {NumberFormat = new NumberFormatInfo() {NumberDecimalSeparator = ","}});
      

      【讨论】:

        【解决方案6】:
        Double.Parse("202.667,40", new System.Globalization.CultureInfo("de-DE"));
        

        使用字符串所在的任何文化而不是 de-DE。

        【讨论】:

          【解决方案7】:
          var val=double.Parse( yourValue, CultureInfo.InvariantCulture);
          

          http://www.erikschierboom.com/2014/09/01/numbers-and-culture/

          【讨论】:

            猜你喜欢
            • 2014-10-02
            • 1970-01-01
            • 1970-01-01
            • 2018-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-10
            相关资源
            最近更新 更多