C# 如何返回用户在PC中使用的当前文化
我读取csv文件,列用逗号分隔。在某些区域性中,分隔符是点,因此我决定将当前区域性更改为“en-US”,后者使用逗号作为分隔符。但当我完成一些操作后,我需要返回用户使用的文化。但我不能 如何返回用户使用的当前区域性C# 如何返回用户在PC中使用的当前文化,c#,wpf,cultureinfo,culture,C#,Wpf,Cultureinfo,Culture,我读取csv文件,列用逗号分隔。在某些区域性中,分隔符是点,因此我决定将当前区域性更改为“en-US”,后者使用逗号作为分隔符。但当我完成一些操作后,我需要返回用户使用的文化。但我不能 如何返回用户使用的当前区域性 Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); // do something CultureInfo ci = CultureInfo.CurrentCulture; var a
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
// do something
CultureInfo ci = CultureInfo.CurrentCulture;
var a = ci.DisplayName;
是否继续为“en-US”只需保存然后还原:
另一个(有点异国情调)可能是在专门设计的类中隐藏逻辑:
public sealed class CurrentCulture: IDisposable {
private CultureInfo m_Saved;
public CurrentCulture(CultureInfo info) {
//TODO: validate info
m_Saved = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = info;
}
public CurrentCulture(String name) :
this(new CultureInfo(name)) {
}
public void Dispose() {
if (m_Saved != null) {
Thread.CurrentThread.CurrentCulture = m_Saved;
m_Saved = null;
}
}
}
...
using (var c = new CurrentCulture("en-US")) {
// do something
}
我不太明白你的问题。是否要将
“en-US”
作为字符串返回?只需返回ci.Name
?您可能不想为了读取csv文件而更改当前区域性,因为这可能会产生不必要的副作用。您应该将访问csv的代码更改为使用其自己的cultureinfo,并改为使用接受IFormatProvider的方法重载。我在更改之前保存了区域性,现在工作正常。用两行代码是这样工作的我想要的。谢谢你对Dmitry Bychenko和Dion V的帮助。这太尴尬了。请问您为什么要把Thread.CurrentThread.CurrentCulture=CultureInfo.GetCultureInfo(“en-US”)代码>在块中尝试吗?它只抛出ArgumentNullException
,但这是您想要捕获的吗?@Dion V:从技术上讲,您可以将Thread.CurrentThread.CurrentCulture=CultureInfo.GetCultureInfo(“en-US”)
*在try
中,这只是我的习惯:无论发生什么(例如“en-US”
未找到),我都要确保Thread.CurrentThread.CurrentCulture=已保存代码>将被调用,因此区域性将被恢复。最后忘记部分,当场。
public sealed class CurrentCulture: IDisposable {
private CultureInfo m_Saved;
public CurrentCulture(CultureInfo info) {
//TODO: validate info
m_Saved = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = info;
}
public CurrentCulture(String name) :
this(new CultureInfo(name)) {
}
public void Dispose() {
if (m_Saved != null) {
Thread.CurrentThread.CurrentCulture = m_Saved;
m_Saved = null;
}
}
}
...
using (var c = new CurrentCulture("en-US")) {
// do something
}
//Save your current culture;
var myCurrentCulture = Thread.CurrentThread.CurrentCulture;
//Adjust the culture
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
//Set it back
Thread.CurrentThread.CurrentCulture = myCurrentCulture;
CultureInfo ci = CultureInfo.CurrentCulture;
var a = ci.DisplayName;