Scala 如何将字符串转换为双精度后与字符串进行比较?

Scala 如何将字符串转换为双精度后与字符串进行比较?,scala,Scala,我正在寻找一种惯用的方法,将两个字符串转换为一个双精度字符串,然后比较它们 要安全地转换为双精度,我有: def toDouble(s: String): Option[Double] = { try { s.toDouble } catch { case _ => None } } 所以我做了一个for表达式来比较两个double: for { d1 <- toDouble(s1) d2 <- toDouble(s2) } yield (d1 > d2)

我正在寻找一种惯用的方法,将两个字符串转换为一个双精度字符串,然后比较它们

要安全地转换为双精度,我有:

def toDouble(s: String): Option[Double] = {
  try { s.toDouble } catch { case _ => None }
}
所以我做了一个for表达式来比较两个double:

for {
  d1 <- toDouble(s1)
  d2 <- toDouble(s2)
} yield (d1 > d2)
用于{
d1
import scala.util.Try
def(x:String,
y:弦,
比较:(Double,Double)=>Boolean):选项[Boolean]=for{
a f(“42”、“66”和
res1:Option[Boolean]=Some(false)
我更喜欢比布尔型更好的类型,所以我的答案还有改进的余地。

import scala.util.Try
def(x:String,
y:弦,
比较:(Double,Double)=>Boolean):选项[Boolean]=for{
a f(“42”、“66”和
res1:Option[Boolean]=Some(false)
我更喜欢比布尔型更好的类型,因此我的答案还有改进的余地。

如果您试图将无法转换为双精度的内容转换为双精度,则您引用的“toDouble”会引发数字格式异常。这将是“惯用的”只使用它,但将其包装在scala.util.Try中并返回Try

返回Try而不是Option将更为惯用(而且更简单),因为从语义上讲,没有一个选项不指示调用方发生了问题,而Try结果(类似于
Failure(java.lang.NumberFormatException:For input string:“hi”)
将指示这一点

最后,我将跳过这一点上的For/Yield,因为只需执行以下操作更简单:

import scala.util.Try

Try(s1.toDouble < s2.toDouble)
导入scala.util.Try
Try(s1.toDouble
Kevin Meredith的回答显示了如何通过创建高阶函数来进行泛化。

如果您尝试将无法转换为双精度的东西转换为双精度,则引用中可用的“toDouble”会抛出一个NumberFormatException。只使用它是“惯用”的,但将其包装在scala.util.Try中并返回Try

返回Try而不是Option将更为惯用(而且更简单),因为从语义上讲,没有一个选项不指示调用方发生了问题,而Try结果(类似于
Failure(java.lang.NumberFormatException:For input string:“hi”)
将指示这一点

最后,我将跳过这一点上的For/Yield,因为只需执行以下操作更简单:

import scala.util.Try

Try(s1.toDouble < s2.toDouble)
导入scala.util.Try
Try(s1.toDouble

Kevin Meredith的回答显示了如何通过创建一个高阶函数来进行泛化。

当一个或两个double都是
None
时,预期的结果是什么?如何比较不存在的东西?@Eric我只会返回一个None,然后调用代码就会处理它。当一个或两个double都是
时,预期的结果是什么double是
None
?你如何比较不存在的东西?@Eric我只会返回一个None,然后调用代码就会处理它。
“正如Conor McBride所说,要使用布尔值,你必须知道它的来源,以便知道它的含义。”
source-很好地将FP歌词放在我身上…你是核心FP:)
“正如Conor McBride所说,要使用布尔值,你必须知道它的出处,这样你才能知道它的意思。”
source-很好地将FP歌词放在我身上…你是核心FP:)