C# 关于更改主线程中的CurrencyGroupSeparator和CurrencyDecimalSeparator

C# 关于更改主线程中的CurrencyGroupSeparator和CurrencyDecimalSeparator,c#,globalization,number-formatting,C#,Globalization,Number Formatting,具有显示相同输出的组分隔符和十进制分隔符的解析数 例如: decimal.parse("2,00", Currency) // output is 2 decimal.parse("2.00", Currency) // output is 2 所以我的问题是,为什么两者都给出了相同的输出,因为我已经更改了它们的分隔符。我必须同意Jon的观点,因为格式很难理解。首先,第二行不会产生值2,您必须将其重写为: var result = decimal.Parse("200", NumberSty

具有显示相同输出的组分隔符和十进制分隔符的解析数

例如:

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


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

我必须同意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
解析方法的这个重载将把要用于转换的区域性作为第三个参数

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


还有一个提示:小心不要将解析与输出格式混为一谈!在这个场景中,更改整个线程的区域性也不是很有用:-)。

我认为这个片段可以帮助您找到正确的方法

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 

请更仔细地格式化您的问题-我相信您的代码看起来并不是这样的。此外,您谈论“输出”,但没有输出-您正在解析,然后忽略结果。一个简短但完整的程序来演示这个问题会使你更容易得到帮助。
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