【问题标题】:Parse and TryParse解析和 TryParse
【发布时间】:2014-06-03 02:12:48
【问题描述】:

我想知道其他人在用 parse/try parse for decimals 作为例子做了什么。 在 PHP 中,我会编写一个名为 GetValueOrDefault(value, default) 的方法,它接受两个参数 - 第一个参数是您希望尝试解析为整数或小数的字符串或值,第二个参数是默认参数如果失败。

我想要在 .net 中这样的东西,但我看到了这个:

  decimal salary = 0.0; //initialize salary
  if (!Decimal.TryParse(myStringValue, out salary))
      salary = 0;

所以对我来说,“Tryparse”布尔返回类型对我来说不是必需的——我没有采取任何特殊行动,也不在乎。我想要的只是“如果转换失败,则默认返回我初始化值的值,否则不做任何事情。”

另外,我不想进行 Parse,因为我的理解是这会引发异常。我不需要 try..catch,因为我已经初始化了变量(在 catch 中我还应该做什么?我不需要在任何地方登录)。

我真的应该写一个扩展方法或辅助工具方法来完成上述工作吗?我觉得我显然缺少一个简单的解决方案。

谢谢大家!

【问题讨论】:

  • 是的,如果你想拥有一个与现有方法不同的方法,你应该编写自己的方法。借助TryParse 方法,清楚地实现您想要的方法很容易。
  • 如果你的默认值总是0,你就不需要再写一个方法了。如果TryParse() 无法解析您的字符串,它会将数字的值设置为 0。
  • 我会考虑避免将您的方法命名为GetValueOrDefault() - Nullable<T> 类型已经拥有该方法。为什么不TryParseOrDefault()
  • @GoldenDragon 是对的。对于您的方案(如果您不需要知道它是否失败),删除 if 会给您相同的结果
  • Out 参数不必初始化,因此您可以使用:十进制工资; if (!Decimal.TryParse(myStringValue, out Salary)) Salary = 0.0;

标签: c# type-conversion


【解决方案1】:

如果您不关心它是否已解析,则无需将其包装在 if 中。但是,如果失败,您的 salary 参考参数将为零。因此,在您已将 salary 初始化为零以外的值的情况下,您应该注意它是否已解析。

【讨论】:

  • 如果您不检查返回值,那么您将无法区分未解析的值和恰好被解析为零的值之间的区别。如果所需的默认值为零,这是一个选项,而此问题不是这种情况。
【解决方案2】:

我总是使用扩展方法,与 usr 建议的非常相似,略有不同:

public static decimal GetDecimalOrDefault(this string value, decimal defaultDecimal)
{
    try 
    {
        return Convert.ToDecimal(value);
    }
    catch(exception ex)
    {
        return defaultDecimal;
    }
}

那么你可以这样称呼它:

decimal finalValue = 0.0;
string myStringValue = "123.456";
finalValue = myStringValue.GetDecimalOrDefault(finalValue);

【讨论】:

  • 异常不应用于控制流。
  • @Servy 这背后的原因是什么?我觉得我的解决方案满足了问题的要求,但除非它对性能有影响,否则我认为这不一定是错误的答案。
  • 对每个异常都有巨大的性能影响,这是一个糟糕的解决方案
【解决方案3】:
var salary = Decimal.TryParse(myStringValue, out var value) ? value : 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多