如何返回用户在 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() 是安全的,无论传递整数时两端使用的当前文化如何

如何修改 Blazor(服务器)中的当前文化日期格式?

什么是不变文化?

如何在返回流的函数中获取当前用户

使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化

如何创建不在当前文化中的 DateTime 对象