Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数字从字符串转换为整数,小数由逗号或点分隔_C#_.net_Xaml_Numbers_Locale - Fatal编程技术网

C# 将数字从字符串转换为整数,小数由逗号或点分隔

C# 将数字从字符串转换为整数,小数由逗号或点分隔,c#,.net,xaml,numbers,locale,C#,.net,Xaml,Numbers,Locale,我有一个包含数字的字符串。它可以是一个带小数的数字,后跟逗号或点,具体取决于用户的区域设置 这些数字实际上是百分之一百,我想把它们转换成普通的整数。例如,我希望字符串“14.5”和“145000”以int1450结尾 可能是我,但当小数被逗号分隔时,我不知道如何正确地将这个数字转换成具有相应值的int。我试过这个: double-valueDouble; double.TryParse(SpecificTemperatureTextBox.Text,NumberStyles.Any, Cultu

我有一个包含数字的字符串。它可以是一个带小数的数字,后跟逗号或点,具体取决于用户的区域设置

这些数字实际上是百分之一百,我想把它们转换成普通的整数。例如,我希望字符串
“14.5”
“145000”
以int
1450
结尾

可能是我,但当小数被逗号分隔时,我不知道如何正确地将这个数字转换成具有相应值的int。我试过这个:

double-valueDouble;
double.TryParse(SpecificTemperatureTextBox.Text,NumberStyles.Any,
CultureInfo.CurrentCulture,out valueDouble);
int-valueInt=Convert.ToInt32(valueDouble*100);
但这有时是错误的。以下是我的结果:

转换时是否未正确使用?我不想将字符串中的
替换为
,因为这看起来太脏了


如何执行此操作?

使用CurrentCulture将根据CurrentCulture的值正确解析带点或逗号的数字。但并不是同时使用,因为在没有文化的情况下,点和逗号是可互换的


因此,您必须将点替换为所有逗号,反之亦然。然后使用“点分隔符区域性”或“逗号分隔符区域性”设置进行解析。

最安全的方法可能是尝试使用两种区域性解析输入,如下所示:

private static int ConvertStringValue(string value)
{
  decimal valDouble;

  var comma = (NumberFormatInfo)CultureInfo.InstalledUICulture.NumberFormat.Clone();
  comma.NumberDecimalSeparator = ",";
  comma.NumberGroupSeparator = ".";

  var dot = (NumberFormatInfo)CultureInfo.InstalledUICulture.NumberFormat.Clone();
  dot.NumberDecimalSeparator = ".";
  dot.NumberGroupSeparator = ".";

  if (decimal.TryParse(value, NumberStyles.Currency, comma, out valDouble))
  {
    return Convert.ToInt32(valDouble * 100); 
  }
  else if (decimal.TryParse(value, NumberStyles.Currency, dot, out valDouble))
  {
    return Convert.ToInt32(valDouble * 100);
  }
  else
  {
    return Convert.ToInt32(value);
  }
}

您需要知道(并使用)用户的区域设置。或者写一些检测逻辑。只有1个TryParse()没有解决方案。如果它取决于用户的区域设置,您将无法同时测试这两项工作(如在测试中)。@HenkHolterman我认为
CultureInfo.CurrentCulture
的参数中的
TryParse
将处理meIt的情况,因此您的解决方案(可能)可以工作。但是,您不能同时测试这两个字符,您必须使用不同的区域设置进行测试。如果您可以安全地假设除了
之外,没有其他十进制分隔符,那么这可能也行得通,尽管是一个丑陋的解决方案:
int-valueInt=Convert.ToInt32(SpecificTemperatureTextBox.Text.Replace(.“,”).Replace(“,”).Replace(,”.PadRight(5,'0')和担心12500.00对12500.00的问题没有提到数千的分隔符,只是小数部分分隔符。但即使使用了数千的分隔符,也只需除去最后一个点或逗号即可。绝对棒极了,这正是有效的方法。我最终使用了
CultureInfo.CurrentCulture
,这显然取决于区域设置(为Windows Phone 8.1和.NET 4.5开发)
private static int ConvertStringValue(string value)
{
  decimal valDouble;

  var comma = (NumberFormatInfo)CultureInfo.InstalledUICulture.NumberFormat.Clone();
  comma.NumberDecimalSeparator = ",";
  comma.NumberGroupSeparator = ".";

  var dot = (NumberFormatInfo)CultureInfo.InstalledUICulture.NumberFormat.Clone();
  dot.NumberDecimalSeparator = ".";
  dot.NumberGroupSeparator = ".";

  if (decimal.TryParse(value, NumberStyles.Currency, comma, out valDouble))
  {
    return Convert.ToInt32(valDouble * 100); 
  }
  else if (decimal.TryParse(value, NumberStyles.Currency, dot, out valDouble))
  {
    return Convert.ToInt32(valDouble * 100);
  }
  else
  {
    return Convert.ToInt32(value);
  }
}