在主线程中更改 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的主要内容,如果未能解决你的问题,请参考以下文章