在主线程中更改 CurrencyGroupSeparator 和 CurrencyDecimalSeparator

Posted

技术标签:

【中文标题】在主线程中更改 CurrencyGroupSeparator 和 CurrencyDecimalSeparator【英文标题】:On changing CurrencyGroupSeparator and CurrencyDecimalSeparator in main thread 【发布时间】:2014-02-19 17:27:56 【问题描述】:

在解析具有组分隔符和小数分隔符的数字时显示相同的输出。

例如:

decimal.parse("2,00", Currency) // output is 2
decimal.parse("2.00", Currency) // output is 2

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 number =  Decimal.Parse("2,00$", System.Globalization.NumberStyles.Currency | System.Globalization.NumberStyles.Number);

// Output is 2 and 
Decimal.Parse("2.00$", System.Globalization.NumberStyles.Currency | System.Globalization.NumberStyles.Number);
// Output is 2

所以我的问题是为什么两者都给出相同的输出,因为我已经改变了它们的分隔符。

【问题讨论】:

请更仔细地格式化您的问题 - 我确定您的代码看起来并不像那样。此外,您谈论“输出”但没有输出 - 您正在解析,然后忽略结果。一个简短但完整的程序演示问题会更容易帮助你。 【参考方案1】:

我必须同意 Jon 的观点,因为格式让人难以理解。首先,您的第二行不会产生值 2,您必须将其重写为:

var result = decimal.Parse("200", NumberStyles.Currency);

这将导致值200(不是2!)。您在中间部分所做的文化信息杂技可以缩短为

var result = decimal.Parse("2.00$", NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US"));
Console.WriteLine(result);
// output on console is 2

Parse 方法的这种重载会将您要用于转换的文化作为第三个参数。

如果您输入另一种文化,例如 fr-CA,则会抛出 FormatException。所以这是正确的,在这一点上我对你现在想要做什么感到困惑?您想使用输入中包含的字符串创建自己的文化吗?这对我来说毫无意义。也许您想检查输入字符串是否与文化匹配。在文化中有效吗?那你应该深入了解TryParse

还有一个提示:注意不要将解析与输出格式混为一谈!在这种情况下,更改完整线程的文化也不是很有用:-)。

【讨论】:

【参考方案2】:

我认为这个 sn-p 可以让你走上正确的道路。

CultureInfo cultureCA = CultureInfo.CreateSpecificCulture("fr-CA");
NumberFormatInfo numberFormat = cultureCA.NumberFormat;

numberFormat.CurrencyGroupSeparator = ".";
numberFormat.CurrencyDecimalSeparator = ",";
Thread.CurrentThread.CurrentCulture = cultureCA;
decimal num = Decimal.Parse("2,00$", System.Globalization.NumberStyles.Currency 
                    | System.Globalization.NumberStyles.Number);

Console.WriteLine(num == 2M);
// true, num is 2 

num = Decimal.Parse("2.00$", System.Globalization.NumberStyles.Currency 
                   | System.Globalization.NumberStyles.Number);
Console.WriteLine(num == 200M);
// true, num is 200 

【讨论】:

以上是关于在主线程中更改 CurrencyGroupSeparator 和 CurrencyDecimalSeparator的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy + pyqt5:信号仅在主线程错误中有效

一个线程中对 MOC 属性的更改未传播到主线程

如何使用 combine Publisher 更改线程?

如何更改默认请求完成队列?

iOS 在后台保存主线程 NSManagedObjectContext 更改

如何使用来自备用线程的更改来更新其他上下文