【问题标题】:Converting a number from a string to an int with decimals separated by comma or dot将数字从字符串转换为整数,小数用逗号或点分隔
【发布时间】:2015-05-26 04:18:41
【问题描述】:

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

这些数字实际上是百分之一,我想将它们转换为普通的旧整数。例如,我希望字符串 "14.5""14,5000" 以 int 1450 结尾。

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

double valueDouble;
double.TryParse(SpecificTemperatureTextBox.Text, NumberStyles.Any,
    CultureInfo.CurrentCulture, out valueDouble);

int valueInt = Convert.ToInt32(valueDouble * 100);

但这有时会出错。这是我的结果:

TextBox value     Expected result     Converted result
"14"              1400                1400 (good)
"14.0"            1400                1400 (good)
"14.5"            1450                1450 (good)
"14,0"            1400                14000
"14,5"            1450                14500

我在转换时没有正确使用System.Globalization 吗?我不想将字符串中的, 替换为.,因为那样看起来太脏了。

我该怎么做?

【问题讨论】:

  • 您需要了解(并使用)用户的区域设置。或者写一些检测逻辑。只有 1 个 TryParse() 没有解决方案。
  • 如果它取决于用户的语言环境,您将无法同时测试这两项工作(就像在您的测试中一样)。
  • @HenkHolterman 我认为TryParse 的参数中的CultureInfo.CurrentCulture 会为我处理这个问题
  • 确实如此,因此您的解决方案(可能)有效。但是,您不能同时测试两者,您必须使用不同的区域设置进行测试。
  • 如果您可以放心地假设除了., 之外没有其他小数分隔符,那么这也可能有效 - 虽然解决方案很丑:int valueInt = Convert.ToInt32(SpecificTemperatureTextBox.Text.Replace(".", "").Replace(",", "").PadRight(5, '0'));

标签: c# .net xaml numbers locale


【解决方案1】:

也许最安全的选择是尝试使用两种文化解析输入,如下所示:

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);
  }
}

【讨论】:

  • 太棒了,这正是有效的方法。我最终使用了CultureInfo.CurrentCulture,这显然取决于区域设置(使用 .NET 4.5 为 Windows Phone 8.1 开发)
【解决方案2】:

使用 CurrentCulture 将根据 CurrentCulture 的值正确解析带点或逗号的数字。但并非两者同时存在,因为在任何文化中点和逗号都不能互换。

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

【讨论】:

  • 担心 12,500.00 与 12.500,00
  • 问题没有提到千位分隔符,只是小数部分分隔符。但即使使用千位分隔符,也只需删除除最后一个点或逗号之外的所有内容。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多