C# 为班级设置特定的文化

Posted

技术标签:

【中文标题】C# 为班级设置特定的文化【英文标题】:C# Set specific culture for class 【发布时间】:2010-02-23 15:23:59 【问题描述】:

我有一个 C# 类,它有各种方法。我想在这个类的所有方法中使用en-USculture。我可以为特定班级设置文化吗?

背景:我有一个List<object>,其中一些object 是数字,有些是字符串。 我想要所有使用美国文化书写的数字,但我不知道哪些项目是数字。 object 类的 ToString() 似乎不接受文化论点。

【问题讨论】:

您可以在循环中检查对象是否为 int/float 并相应地进行转换,或者在循环时设置全局文化。查看我的编辑。 【参考方案1】:

类是一种数据结构,而本地化字符串格式是行为。从代码/编译器的角度来看,这两件事彼此无关,在“每个类”的基础上设置它是没有意义的。这个问题属于使用类的代码的范围,或者属于类本身的代码。

全局文化信息按线程设置(使用Thread.CurrentThread.CurrentCultureCultureInfo.CurrentCulture)。您可以做的一件事是将类的每个方法包装在文化集/恢复中。由于线程文化在所有情况下都是一个全局变量,因此如果您的类在其他地方调用,这可能会出现问题。

如果你想为你的类指定一种文化,最好的方法是只使用一个文化实例作为类属性,然后使用大多数字符串/数字格式的文化特定重载功能。

class MyClass 
    public CultureInfo Culture  get; set; 

    public void GetSomeString() 
        return new Int32().ToString(Culture);
    

编辑:仔细看看你的问题,我认为你想要做的事情是这样的:

var lastCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
try 
   // loop over list here

finally 
    Thread.CurrentThread.CurrentCulture = lastCulture;

【讨论】:

@llia: CultureInfo 的 CurrentCulture 属性似乎是只读的:( @llia, nobugz:尽管 Thread.CurrentThread.CurrentCulture 有效,但我选择了该解决方案。非常感谢您的回复:) 你是对的,我的错。使用Thread.CultureInfo是正确的方式。【参考方案2】:

您可以尝试转换您的项目,并在结果项目上调用 ToString,指定本地化(在发生 InvalidCastException 时捕获并适当处理),因为它在字符串或数字中是允许的。解决方案充其量是有异味,但可行。

【讨论】:

以上是关于C# 为班级设置特定的文化的主要内容,如果未能解决你的问题,请参考以下文章

DateTimePicker 设置日历和时间文化

Windows 容器 - 文化设置

Android:如何为应用程序设置文化值

C# DateTime ToString 标准文化格式

多区域项目中特定区域的多文化

在 C# 中循环访问不同语言/文化的嵌入式资源