将它们转换为double后如何比较字符串?

时间:2016-08-17 18:59:13

标签: scala

我正在寻找一种将2个字符串转换为双字符然后进行比较的惯用方法吗?

为了安全地转换为双倍,我有:

def toDouble(s: String): Option[Double] = {
  try { s.toDouble } catch { case _ => None }
}

所以我正在做一个for表达式来比较2个双打:

for {
  d1 <- toDouble(s1)
  d2 <- toDouble(s2)
} yield (d1 > d2)

现在说我想做(d1 < d2),我能以某种方式推广这个吗?

是否有任何改进使这个更干净?

2 个答案:

答案 0 :(得分:2)

import scala.util.Try

     def f(x: String, 
           y: String, 
           compare: (Double, Double) => Boolean): Option[Boolean] = for {
         a <- Try { x.toDouble }.toOption
         b <- Try { y.toDouble }.toOption
     } yield compare(a, b)

scala> f("42", "66", _ < _)
res0: Option[Boolean] = Some(true)

scala> f("42", "66", _ > _)
res1: Option[Boolean] = Some(false)

我更喜欢比Boolean更好的类型,所以我的答案还有改进的余地。

答案 1 :(得分:1)

如果您尝试转换无法转换为Double的内容,则引用的StringLike中提供的“toDouble”会抛出NumberFormatException。使用它是“惯用的”,但将其包装在scala.util.Try中并返回Try。

返回尝试而不是选择将更加惯用(并且更好),因为“无”在语义上不会向调用者指示问题发生,而“尝试”结果(看起来像Failure(java.lang.NumberFormatException: For input string: "hi")则表示如此)。

最后,我会跳过For / Yield,因为更简单地执行以下操作:

import scala.util.Try

Try(s1.toDouble < s2.toDouble)

Kevin Meredith的回答显示了如何通过创建更高阶函数来推广。