试图为当前语言设置小数点分隔符,得到“实例是只读的”
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;
【讨论】:
以上是关于试图为当前语言设置小数点分隔符,得到“实例是只读的”的主要内容,如果未能解决你的问题,请参考以下文章
当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度
在SQL数据库中,设置了一个字段的类型为money,但是money类型数据保留的是四位小数,如何设置为两位小数?