有没有办法为整个应用程序设置文化?所有当前线程和新线程?
我们将文化的名称存储在数据库中,当我们的应用程序启动时,我们就会这样做
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Run Code Online (Sandbox Code Playgroud)
但是,当然,当我们想要在新线程中做某事时,这会"丢失".有没有办法设置CurrentCulture和CurrentUICulture整个应用程序?那么新线程也会获得这种文化?或者,只要创建了一个我可以连接的新线程,就会触发某个事件?
当我在C#中有这样的代码时:
double a = 0.003;
Console.WriteLine(a);
Run Code Online (Sandbox Code Playgroud)
它打印"0,003".
如果我有另一段代码:
double a = 0.003;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));
Run Code Online (Sandbox Code Playgroud)
它打印"0.003".
我的问题是我需要一个点作为十进制标记,但C#默认使用逗号.此外,我不想只打印出一个双变量来输入如此长的代码.
我有一个与.NET 4.5相关的非常奇怪的问题.今天用户告诉我,他无法将浮动数字输入文本框(如"2.75").文本框不接受".",这是我文化中浮动数字的正确"分隔符"("de-CH").
我用.NET 4.5编译软件之后发生了这个问题(以前它是4.0).
我可以重现这个错误.应用程序中的所有其他文本框都正常工作.文本框是常规WPF控件.没有花哨的用户定义控件或类似的东西.
再说一次:文本框不接受'.' 作为一个角色.它似乎完全忽略了它.每个其他角色(甚至像"@"这样的特殊角色)都很好.在.NET 4.0上重新编译应用程序解决了这个问题.
文本框的xaml是:
<TextBox x:Name="_Hours" Grid.Row="9" Grid.Column="1" VerticalAlignment="Center"
TextAlignment="Center" FontWeight="Bold" FontSize="16" Text="{Binding ProcessHours,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextChanged="Hours_TextChanged" />
Run Code Online (Sandbox Code Playgroud)
ProcessHours的定义:
partial class ProjectTask
{
...
public double TotalProcessHours { get { return ProjectBookings.Sum(b =>
b.ProcessHours); }}
...
}
Run Code Online (Sandbox Code Playgroud)
Hours_TextChanged是:
private void Hours_TextChanged(object sender, TextChangedEventArgs e)
{
UpdateHoursValidity();
}
Run Code Online (Sandbox Code Playgroud)
UpdateHoursValidity()只是淡化实际文本框下面的文本消息.它没有以任何方式与"损坏"文本框连接:
private void UpdateHoursValidity()
{
string key = IsInvalidHoursWarning ? "ShowWarningStoryboard" :
"HideWarningStoryboard";
var storyboard = FindResource(key) as Storyboard;
if(storyboard != null) storyboard.Begin();
}
Run Code Online (Sandbox Code Playgroud)
所以这里也没什么特别的.
到目前为止我尝试了: - 删除文本框,重新编译,再次添加文本框,重新编译 …
我使用.NET4
我使用 en-US 语言环境,并且希望我的应用程序仅以这种方式工作。
不过,我的一些软件客户来自小数点用“,”表示的国家(例如挪威)。
因此,下一行为我的挪威客户抛出异常:
double a = double.Parse("1.5");
Run Code Online (Sandbox Code Playgroud)
我读过我可以更改 CurrentCulture,如下所示:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Run Code Online (Sandbox Code Playgroud)
问题是我必须为每个线程单独执行此操作。此外,我不完全确定我将在哪里隐式解析双精度,所以我必须在每个线程创建时执行此操作......
我读到有一个针对 .NET 4.5 的解决方案,通过更改DefaultThreadCurrentCulture.
有没有人想到一个通用的解决方案,无需升级我的 .NET 框架版本?