【问题标题】:TryParse not working when trying to parse a decimal number to an Int尝试将十进制数解析为 Int 时 TryParse 不起作用
【发布时间】:2015-11-18 00:49:20
【问题描述】:

我正在尝试解析可能有小数的字符串。我正在使用Int32.TryParse,但它似乎不起作用。

这是我尝试解析的函数:

private NumberStyles styles = NumberStyles.Number;
private CultureInfo culture = CultureInfo.CurrentCulture;
public int? ParseInt(string node)
{
    int number;
    if (Int32.TryParse(node, styles, culture.NumberFormat, out number))
    {
        return number;
    }
    return null;
 }

这是我失败的单元测试

[Fact]
public void TestParseIntWithDecimal()
{
    string provided = "28.789";
    int expected = 28;

    int? actual = _parser.ParseInt(provided);

    Assert.NotNull(actual);
    Assert.Equal(expected, actual);
}

当我运行单元测试时,nullParseInt 返回,我不明白为什么。我以为TryParse 可以将十进制数解析为整数。

【问题讨论】:

  • 你也可以先将数字四舍五入,所以它是一个整数......
  • 男孩,问题应该是这样的。简单,带有可以测试的工作代码。不错。
  • 在我现在删除的答案中,我将AllowThousandsAllowDecimalPoint 混淆了,前者可以让int.Parse() 用逗号解析数字(取决于文化)。在某些文化中,逗号是小数点分隔符。如果小数位仅包含零(如documented),它确实工作:ideone.com/stQ9GY

标签: c# c#-4.0 int


【解决方案1】:

Parse/TryParse 方法非常严格。除了您用作目标的类型之外,它们不接受任何其他类型。 28.789 显然不是 int 所以它失败了。如果您想截断小数部分,您仍然必须先将其解析为decimal。然后你可以使用(int)Math.Floor(num)

private NumberStyles styles = NumberStyles.Number;
private CultureInfo culture = CultureInfo.CurrentCulture;
public int? ParseInt(string node)
{
    decimal number;
    if (decimal.TryParse(node, styles, culture.NumberFormat, out number))
    {
        return (int) Math.Floor(number); // truncate decimal part as desired
    }
    return null;
}

【讨论】:

  • 我没有意识到 TryParse 有多么严格。感谢您的帮助。
  • 您可能需要细化语句“28.789 显然不是 int 所以它失败”int.(Try)Parse 可以处理小数 as long as the fractional digits are all zeroes
  • @CodeCaster:好点。但是我没有说如果输入字符串包含小数位就会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2012-05-28
  • 2018-12-14
  • 2015-11-23
  • 2016-07-17
  • 2019-01-30
相关资源
最近更新 更多