- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个错误报告,其中 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”部分。
最佳答案
您刚刚选择了一种恰好使用 .
作为小数点的文化:
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
}
前一种方法可能更简洁 - 这并不是说您真的在这里获得了“资源”。
关于c# - CurrentThread.CurrentCulture 和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24243774/
我有一个使用任务的应用程序。我们还修改了 cultureInfo(我们使用 EN-US 语言,但保留日期/数字格式),我们使用 .Net 4.0。 应用程序有很多线程和任务,我们有一个用于创建任务/线
谁能告诉我 Application.CurrentCulture 和 Thread.CurrentCulture 之间的区别。 线程有CurrentCulture 和CurrentUICulture。
我需要根据每种文化的资源文件在运行时更改文化。 我需要根据两种文化更改表单中控件的属性其中有指定的.resx文件 resorces1.aspx.resx // default resorces1.as
在 .net 2 winforms 应用程序中,为整个应用程序设置文化的好方法是什么? 为每个新线程设置 CurrentThread.CurrentCulture 是重复且容易出错的。 理想情况下,我
CultureInfo.CurrentCulture 可以为空吗? 空值会使我的程序崩溃,这是我不想要的。所以我问,为了安全起见,我需要做什么吗? var culture = CultureInfo.
我有一个具有以下命名空间的窗口 xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib" 包含一个文本框 根据 Gusd
正如您所看到的,我尝试将线程的 CurrentCulture 捕获到实例变量中,以便我可以在整个类中重用它,但它并没有持久存在。在上面的照片中,我显示即使在分配它之后,值仍然不同。这是为什么? 最佳答
我们的应用程序允许用户更改他们运行它的文化,并且该文化可以与底层操作系统文化不同。我发现这样做的唯一方法是为每个线程设置 Thread.CurrentThread.CurrentCulture 和 T
Thread.CurrentCulture 从哪里获取数据?客户端(浏览器)或服务器。 另一个问题,这是找出用户文化的正确方法吗? 谢谢 最佳答案 Thread.CurrentCulture 获取正在
我用一个按钮创建了一个简单的窗口应用程序 public partial class Form1 : Form { public Form1() { Initialize
我有一个错误报告,其中 double.Parse(input) 在输入 "0.69803923368454" 时抛出以下异常: FormatException: Unknown char: . Sys
我的解决方案中有多个项目:我有一个名为“Api”的 WebApi 项目,它引用了一个名为“Models”的类库。我在我的网络配置中设置全局化信息是这样的: 我的“模型”项目中有一些资源 (.resx
在 iPhone 上,用户可以选择他的显示语言和用于格式化的区域。 显示语言相当于.NET的Thread.CurrentUICulture,即UI的语言。 格式化区域等同于 .NET 的 Thread
尽管我本地化了当前文化,但以下代码返回英文名称。 List languageList = new List(); CultureInfo[] cultureList = CultureInfo.Get
在较旧的 asp.net 项目中,我们通常在 Application_BeginRequest - 处理程序 (Global.asax) 中设置语言,如下所示: System.Threading.Th
使用: Console.WriteLine(System.Globalization.CultureInfo.CurrentCulture.ToString()); 我得到 “en-US”。 我应该在
我将 Global.asax 设置为: protected void Application_BeginRequest(object sender, EventArgs e) {
根据我的研究,不可能更改线程的时区。所以我的问题是为什么你不能? 我原以为将您的应用程序的文化切换到特定国家/地区也会改变这种情况,这似乎是 IMO 的预期行为。 编辑 修改后我明白了为什么默认情况下
我试图获取客户的国家/地区,因此我使用 CultureInfo.CurrentCulture。问题是,当我的加拿大客户使用我的网站时,他们显示为美国人。 看起来 CultureInfo.Current
使用完整的 .NET 框架,您可以使用以下方法获取/设置当前线程的文化和 UI 文化: Thread.CurrentThread.CurrentCulture = culture; Thread.Cu
我是一名优秀的程序员,十分优秀!