使 TryParse 与逗号或点小数分隔符兼容

ng8*_*92b 18 c# decimal tryparse regional-settings

问题:让我们假设您正在使用一个点“。” 作为区域设置中的小数点分隔符,并用逗号对字符串进行编码。

string str = "2,5";

当你decimal.TryParse(str, out somevariable);它时会发生什么?

somevariable 将假设为 0。

你能做些什么来解决它?

1-你可以

decimal.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out somevariable);
Run Code Online (Sandbox Code Playgroud)

它会返回 25,而不是 2.5,这是错误的。

2-你可以

decimal.TryParse(str.Replace(",","."), out num);
Run Code Online (Sandbox Code Playgroud)

它会返回正确的值,但是,如果用户","用作小数点分隔符,它将不起作用。

我无法使其工作的可能解决方案:

在区域设置中获取用户小数点分隔符:

char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
Run Code Online (Sandbox Code Playgroud)

并以某种方式替换 from ",",sepdec,这样如果它是逗号,它将保留一个逗号,如果用户使用点,则用实际的点替换。

提示?

编辑:很多网友发帖有用的信息,最近,使用参数NumberStyles.Any, CultureInfo.GetCultureInfo("pt-PT")tryParse是行不通的,如果你的分隔符设置为“”所以它几乎犯规作出的TryParse‘通用’的fullfill前提。

我会解决这个问题,如果有人有更多提示,欢迎

小智 7

我知道该线程有点旧,但我尝试提供答案。

我使用正则表达式来确定字符串中使用的数字格式。正则表达式还匹配没有小数分隔符的数字(“12345”)。

var numberString = "1,234.56"; // en
// var numberString = "1.234,56"; // de
var cultureInfo = CultureInfo.InvariantCulture;
// if the first regex matches, the number string is in us culture
if (Regex.IsMatch(numberString, @"^(:?[\d,]+\.)*\d+$"))
{
    cultureInfo = new CultureInfo("en-US");
}
// if the second regex matches, the number string is in de culture
else if (Regex.IsMatch(numberString, @"^(:?[\d.]+,)*\d+$"))
{
    cultureInfo = new CultureInfo("de-DE");
}
NumberStyles styles = NumberStyles.Number;
bool isDouble = double.TryParse(numberString, styles, cultureInfo, out number);
Run Code Online (Sandbox Code Playgroud)

HTH

托马斯

  • 它适用于点和逗号,完美 (2认同)

ng8*_*92b 0

我找到了一个解决方案,我是这个区域和逗号主题的初学者,所以如果您有意见来提高对此的理解,请欢迎。

我们首先获取用户在其外部区域选项中设置的小数分隔符Form{InitializeComponent();}(我想要一个通用变量,它允许我更正代码)

 char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
Run Code Online (Sandbox Code Playgroud)

tryParse, 为了使其表现普遍,我们将读取字符串中的点和逗号,并将它们转换为我们定义为的小数分隔符sepdec

decimal.TryParse(str.Replace(",",sepdec.ToString()).Replace(".",sepdec.ToString()),  out somevariable);
Run Code Online (Sandbox Code Playgroud)

我希望这对您有所帮助,请评论改进建议!