试图为当前语言设置小数点分隔符,得到“实例是只读的”

Posted

技术标签:

【中文标题】试图为当前语言设置小数点分隔符,得到“实例是只读的”【英文标题】:Trying to set the decimal separator for the current language, getting "Instance is read Only" 【发布时间】:2014-07-16 16:14:38 【问题描述】:

我的代码最初是为小数点分隔符为“.”的英语市场编写的。所以它期望数值作为字符串使用“。”作为分隔符。但是我们现在在其他地方也有用户,例如,欧洲的小数点分隔符是“,”的地方。

因此,在我的软件(实际上只是当前线程)的上下文中,我想将当前语言的小数分隔符覆盖为“。”即使它默认为其他内容。

我试过了

  String sep = "."; 
  NumberFormatInfo nfi1 = NumberFormatInfo.CurrentInfo;
  nfi1.NumberDecimalSeparator = sep;

但我在第三行收到“Instance is read-only”异常。显然 NumberFormatInfo 是不可写的。那么如何将当前语言的小数点分隔符设置为默认值以外的其他值呢?

【问题讨论】:

您需要将Thread.CurrentCulture 设置为CultureInfo 实例并对该实例进行更改。 【参考方案1】:

您需要创建一个新的文化,您可以使用当前文化作为模板,只需更改分隔符。 然后您必须将当前文化设置为新创建的文化,因为您无法直接更改当前文化中的属性。

string CultureName = Thread.CurrentThread.CurrentCulture.Name;
CultureInfo ci = new CultureInfo(CultureName);
if (ci.NumberFormat.NumberDecimalSeparator != ".")

    // Forcing use of decimal separator for numerical values
    ci.NumberFormat.NumberDecimalSeparator = ".";
    Thread.CurrentThread.CurrentCulture = ci;
 

【讨论】:

“Thread.CurrentThread...”中的“Thread”是什么意思我从编译器得到“当前上下文中不存在名称 Thread”。 @user316117 您可能需要在代码文件顶部添加using System.Threading;。 “线程”是 System.Threading.Thread 类。 @user316117 你真的应该改用CultureInfo ci = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();。原因是当前的文化可能会或可能不会useUserOverride,并且该信息不在Name 中。其他内容也可能已更改,这在 Name 中不可见。 如果/当您将修改后的ci 分配回CurrentCulture,您可能希望也可能不希望将您的版本设为只读,即考虑Thread.CurrentThread.CurrentCulture = CultureInfo.ReadOnly(ci);【参考方案2】:

您可以在 NumberFormatInfo 实例上使用 Clone() 方法,这将创建一个可变版本(即 IsReadOnly = false)。然后您可以设置货币符号和/或其他数字格式选项:

string sep = "."; 
NumberFormatInfo nfi1 = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
nfi1.NumberDecimalSeparator = sep;

【讨论】:

以上是关于试图为当前语言设置小数点分隔符,得到“实例是只读的”的主要内容,如果未能解决你的问题,请参考以下文章

在 xaml 中显示当前区域性小数分隔符

与 XSLT 进行区域感知数字比较

当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度

在SQL数据库中,设置了一个字段的类型为money,但是money类型数据保留的是四位小数,如何设置为两位小数?

使用VBA为负数设置带有千位分隔符、2位小数和减号的标准数字格式?

如何在 Google Charts 中指定小数点分隔符?