我试过了:
[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
。
答案 0 :(得分:2)
来自NumberFormatInfo
constructor
初始化NumberFormatInfo类的新可写实例 与文化无关(不变)。
这意味着它使用的InvariantCulture
也.
作为NumberDecimalSeparator
。我认为您的计划会混淆.
NumberDecimalSeparator
或NumberGroupSeparator
,这就是它抛出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对象的NumberGroupSeparator
和NumberDecimalSeparator
属性使用相同的字符。虽然我在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