【问题标题】:Converting numbers to a single format in C#在 C# 中将数字转换为单一格式
【发布时间】:2015-01-21 19:01:36
【问题描述】:

我有以下情况,从客户端我得到一个字符串中的双精度值,它可以是“en-GB”格式或“de”格式,即 123.10 或 123,10。但是我需要将这两个数字都转换为 123.10。即我尝试使用 NumberFormatInfo 编写以下测试,但是它没有通过:

var format = new NumberFormatInfo { NumberGroupSeparator = ",", NumberDecimalSeparator = "." };

        var a = Double.Parse("23000.10", format);
        var b = Double.Parse("23000,10", format);

        Assert.AreEqual(a,b);

我做错了什么?

【问题讨论】:

  • 您只是确认字符串在 en-GB 中产生不同的值。你已经知道了,测试它没有多大意义。更改为 Assert.AreNotEqual() 以使测试通过。
  • 对...如何让它们产生相同的值,而无需手动检查逗号并用小数替换它。?
  • Random.Next 将是从用户输入中产生随机结果的更具可读性的方式。 23.000,44 应该会给你一些有趣的结果......如果不知道输入格式(.Net 术语中的文化),真的没有办法做你想做的事。
  • 我添加了一个可以解决您的情况的答案,这不是最好的方法,但始终更改 , for .在你的字符串中。希望对您有所帮助。

标签: c# number-formatting cultureinfo


【解决方案1】:

如何让它们产生相同的值

您不能不知道上下文 - 如果您不知道输入的上下文,则无法区分 123,456 是指 123456 还是 123.456

如果您的输入从不包含千位分隔符(您的示例似乎就是这种情况),那么用句点替换逗号是一个合理的解决方案。

【讨论】:

    【解决方案2】:

    嗯,这种转换存在问题。

    无论如何,在某些项目中我使用了以下代码:

    double a = 0;
    double b = 0;
    
    double.TryParse("23000.10".Replace(",","."), out a);
    double.TryParse("23000,10".Replace(",", "."), out b);
    
    Assert.AreEqual(a,b);
    

    不是最好的方法,但它有效。

    【讨论】:

      【解决方案3】:

      你需要指定文化信息,试试这个:

      var cultureInfo1 = new CultureInfo("de-DE");
      var cultureInfo2 = new CultureInfo("en-GB");
      
      var a = Double.Parse("1200,00", cultureInfo1);
      var b = Double.Parse("1200.00", cultureInfo2);
      
      Assert.AreEqual(a,b);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多