Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回用户在PC中使用的当前文化_C#_Wpf_Cultureinfo_Culture - Fatal编程技术网

C# 如何返回用户在PC中使用的当前文化

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

我读取csv文件,列用逗号分隔。在某些区域性中,分隔符是点,因此我决定将当前区域性更改为“en-US”,后者使用逗号作为分隔符。但当我完成一些操作后,我需要返回用户使用的文化。但我不能

如何返回用户使用的当前区域性

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;