如何解析诸如&#​​34; 6.465.654" (没有小数,用点分隔)?

时间:2014-10-14 14:18:07

标签: c# double

我试过了:

[Test]
public void MyTestMethod()
{
    var x = "1.852.520";

    var nfi = new NumberFormatInfo { NumberGroupSeparator = ".", NumberDecimalDigits = 0 };
    var n = double.Parse(x, nfi);

    n.Should().Be(1852.520);
}

但它不起作用。我希望结果为1852.520

3 个答案:

答案 0 :(得分:2)

来自NumberFormatInfo constructor

  

初始化NumberFormatInfo类的新可写实例   与文化无关(不变)。

这意味着它使用的InvariantCulture.作为NumberDecimalSeparator。我认为您的计划会混淆. NumberDecimalSeparatorNumberGroupSeparator,这就是它抛出FormatException的原因。

例如,这有效;

var x = "1.852,520";

var nfi = new NumberFormatInfo { NumberGroupSeparator = ".", 
                                 NumberDecimalDigits = 3,
                                 NumberDecimalSeparator = "," };
var n = double.Parse(x, nfi);

即使是最后一个.也可以是小数分隔符或组分隔符。 编译器无法知道

如果您在NumberDecimalSeparator构造函数中定义.以外的NumberFormatInfo,则问题将得到解决。

在这种情况下,号码将为185252。顺便说一句,我不明白你的1852.520例子。如果.中的1852.520是小数点分隔符,则不会像我说的那样有效。如果.是群组分隔符,则为185252。此1.852.520将代表您的双倍值。

答案 1 :(得分:0)

该号码不是1852.520,而是1852520。这个数字解析得很好,你只是没有正确验证它。您将句点作为组分隔符。

您还需要将NumberDecimalSeparator设置为某些内容。它将默认为".",这是您作为组分隔符所拥有的。您可能希望它为","

答案 2 :(得分:0)

您尝试对NumberFormatInfo对象的NumberGroupSeparatorNumberDecimalSeparator属性使用相同的字符。虽然我在MSDN文档中找不到具体说明的内容,但似乎是一个有效的组合,如下面的测试代码所示:

    private bool SameSeparatorValid(char c)
    {
        string testValue = String.Format("1{0}852{0}520", c);
        double expected = 1852.52;
        var nfi = new NumberFormatInfo
        {
            NumberDecimalSeparator = c.ToString(),
            NumberGroupSeparator = c.ToString()
        };
        try
        {
            double actual = Double.Parse(testValue, nfi);
            return (expected == actual);
        }
        catch (Exception)
        {
            return false;
        }
    }

    public void IterateCultures()
    {
        string msgFormat = "Found {0} cultures (of {1})" 
            + " where NumberGroupSeparator == NumberDecimalSeparator";
        var allCis = CultureInfo.GetCultures(CultureTypes.AllCultures);
        var cis = allCis.Where(
            ci => ci.NumberFormat.NumberGroupSeparator 
                == ci.NumberFormat.NumberDecimalSeparator);
        Console.WriteLine(msgFormat, cis.Count(), allCis.Count());

        var allAscii = Enumerable.Range(0, 127);
        var asciis = allAscii
            .Where(c => SameSeparatorValid((char)c));
        msgFormat = "Found {0} ASII characters (of {1})" 
            + " where NumberGroupSeparator == NumberDecimalSeparator is valid";
        Console.WriteLine(msgFormat, asciis.Count(), allAscii.Count());
   }

在我的机器上产生以下输出:

Found 0 cultures (of 354) where NumberGroupSeparator == NumberDecimalSeparator
Found 0 ASII characters (of 127) where NumberGroupSeparator == NumberDecimalSeparator is valid