我有一个错误报告,其中double.Parse(input)
使用输入"0.69803923368454"
抛出以下异常:
FormatException: Unknown char: .
System.Double.Parse (System.String s, NumberStyles style, IFormatProvider provider) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Double.cs:209)
System.Double.Parse (System.String s) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Double.cs:180)
经过一些搜索后,当默认文化不支持小数字.
时,似乎会出现此问题(请参阅float.Parse fails on decimals and commas);
我需要创建一个单元测试,通过在测试期间强制使用不同的默认文化来重现此问题。当然,这不得干扰任何现有的单元测试。我正在使用随Visual Studio提供的单元测试框架。
这是我尝试过的,但不幸的是,这不会导致报告错误发生:
[TestMethod]
private void DoubleParseWithCultureOverride() {
var restoreCulture = Thread.CurrentThread.CurrentCulture;
var restoreUICulture = Thread.CurrentThread.CurrentUICulture;
try {
// Arrange
Thread.CurrentThread.CurrentCulture = new CultureInfo("ko-KR");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ko-KR");
// Act
double value = double.Parse("0.69803923368454");
// Assert
Assert.AreEqual(0.69803923368454, value);
}
finally {
Thread.CurrentThread.CurrentCulture = restoreCulture;
Thread.CurrentThread.CurrentUICulture = restoreUICulture;
}
}
我期待上面的单元测试失败(即在测试资源管理器面板中变成红色),但它通过了。目前,我纯粹试图用标准的Mono / .NET使用来强制错误。我打算用特定于应用程序的逻辑替换“Act”部分。
答案 0 :(得分:5)
您刚刚选择了一种恰好使用.
作为小数点的文化:
var culture = new CultureInfo("ko-KR");
Console.WriteLine(culture.NumberFormat.NumberDecimalSeparator); // Prints .
我通常使用法语(fr-FR
) - 而 会因您当前的代码而失败。
或者,您可以构建自己的CultureInfo
专门用于测试,使用您想要的任何分隔符。
对于这样的测试,您可能也想要一种更简单的方法来设置文化。选项:
编写一个方法,采取行动在文化中“执行”,然后将其称为:
ExecuteInCulture("fr-Fr", () =>
{
// Parse a double, or whatever
});
创建IDisposable
实施,设置文化并将其恢复到Dispose
:
using (CultureHelper.SetCulture("fr-FR"))
{
// Parse a double, or whatever
}
前一种方法可能更清晰 - 这并不像你真的有“资源”。