在全局线程中更改 NumberFormat 分隔符后,十进制解析抛出异常 [关闭]

Posted

技术标签:

【中文标题】在全局线程中更改 NumberFormat 分隔符后,十进制解析抛出异常 [关闭]【英文标题】:Decimal Parse is throwing exception after changing NumberFormat Seperator in Global Thread [closed] 【发布时间】:2014-02-19 17:16:20 【问题描述】:
   I have changed Global Application Culture thread for currency number format in (fr-CA) as shown below. 

Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyPositivePattern = 1;
                                Thread.CurrentThread.CurrentUICulture.NumberFormat.CurrencyNegativePattern = 5;

                            CultureInfo CADCultureref = new CultureInfo("fr-CA");
                            CADCultureref = Thread.CurrentThread.CurrentCulture;
                            NumberFormatInfo CADNumFormatref = new NumberFormatInfo();
                            CADNumFormatref = Thread.CurrentThread.CurrentCulture.NumberFormat;

                            CADNumFormatref.CurrencyGroupSeparator = ".";
                            CADNumFormatref.CurrencyDecimalSeparator = ",";
                            CADCultureref.NumberFormat = CADNumFormatref;
                            Thread.CurrentThread.CurrentCulture = CADCultureref;
                            Thread.CurrentThread.CurrentUICulture = CADCultureref;

然后我尝试从货币中解析值,如下所示:

Decimal digit = 1000000;
String currency = digit.ToString("C"); //  1.000.000,00$ (fr-CAD)
decimal parseValue = decimal.Parse(currency , System.Globalization.NumberStyles.Currency | System.Globalization.NumberStyles.Number); 

解析值时出现异常“Input String is not in correct format”。

CurrentThread 的 Numberformatinfo 中的组分隔符和小数分隔符更改,无法解析。

我需要用“,”代替“。”和 ”。”代替“,”。

【问题讨论】:

这段代码从何而来?如果您在问题中添加了一些代码,请输入可编译的实际代码。 我不知道它是什么语言,但肯定不是 C#。 可能需要指出的是,法国人用欧元玩大富翁,而不是美元。 我再次更新我的问题。让我知道现在可以理解了吗? 【参考方案1】:

不清楚您的问题是什么,但通常最好将文化信息/数字格式明确传递给格式化和解析函数,例如:

var  numberFormat = new CultureInfo( "en-US", false ).NumberFormat;
numberFormat.CurrencyDecimalSeparator  = ",";
numberFormat.CurrencyGroupSeparator  = ".";
Console.WriteLine(400000.ToString("C", numberFormat)); // Output: $ 4.000,00   
Console.WriteLine(
    decimal.Parse(400000.ToString("C", numberFormat),
           NumberStyles.Currency | NumberStyles.Number, 
           numberFormat));

【讨论】:

以上是关于在全局线程中更改 NumberFormat 分隔符后,十进制解析抛出异常 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Android 的 NumberFormat 使用逗号作为澳大利亚的小数分隔符?

NumberFormat 不能用作系统区域设置的千位分隔符?

NumberFormat 不会因 2 个小数分隔符而崩溃

输入 Intl.NumberFormat 时 VueJS 数字格式实时以逗号分隔

NumberFormat API 说明

在主线程中更改 CurrencyGroupSeparator 和 CurrencyDecimalSeparator