如何返回用户在 PC 中使用的当前文化
Posted
技术标签:
【中文标题】如何返回用户在 PC 中使用的当前文化【英文标题】:How can return on current culture who user used in PC 【发布时间】:2015-11-30 12:45:03 【问题描述】:我读取了 csv 文件,并且列用逗号分隔。在某些文化中,分隔符很重要,因此我决定将当前文化更改为“en-US”,后者使用逗号作为分隔符。但是当我完成一些操作后,我需要返回用户使用的文化。但我不能。
如何返回用户使用的当前文化?
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
// do something
CultureInfo ci = CultureInfo.CurrentCulture;
var a = ci.DisplayName;
仍然是“en-US”
【问题讨论】:
我不太清楚你的问题。你想以string
的形式返回"en-US"
吗?只需返回ci.Name
?
您可能不想仅仅为了读取 csv 文件而更改当前文化,因为这可能会产生不必要的副作用。您应该更改访问 csv 的代码以使用其自己的文化信息,并改用接受 IFormatProvider 的方法重载。
我在改变之前保存了文化,现在效果很好。两行代码以我想要的方式工作。感谢 Dmitry Bychenko 和 Dion V 的帮助。
【参考方案1】:
只需保存然后恢复:
var saved = Thread.CurrentThread.CurrentCulture;
try
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
// do something
finally
Thread.CurrentThread.CurrentCulture = saved;
另一种(有点奇异)的可能性是在专门设计的类中隐藏逻辑:
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
【讨论】:
这很尴尬。请问您为什么将Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
放在try
块中?它只会抛出ArgumentNullException
,但这是你想要捕捉的东西吗?
@Dion V.:从技术上讲,你可以把Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
*out* of try
,这只是我的习惯:不管发生什么(例如"en-US"
找不到) 我想确保Thread.CurrentThread.CurrentCulture = saved;
会被调用,从而恢复文化。
忘记了finally
部分,当机立断。【参考方案2】:
//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;
【讨论】:
以上是关于如何返回用户在 PC 中使用的当前文化的主要内容,如果未能解决你的问题,请参考以下文章
使用 Enum.Parse() 是安全的,无论传递整数时两端使用的当前文化如何