我正在尝试从字符串中获取一个数字,然后检查它是否为int或double。如果它是整数,那么我正在使用toInt
转换数字。如果不是,则使用toDouble
转换为Double。
val str = 50 units
val num = str.split("\\D+").filter(_.nonEmpty)
val y = num(0).toDouble
val x = num(0).toInt
if (x==y) {
x
//print("int")
} else {
y
//print("double")
}
这是我尝试过的代码。问题是即使条件为真,我也会将数字转换为两倍。有人可以解决这个问题吗?
答案 0 :(得分:2)
第一个问题-您正在分割非数字字符,因此它将在点.
上分割,您将永远得不到正确的Double
值。
第二个问题-x
和y
变量将总是相等的,因为它们都来自相同的数字字符串。 50 == 50.0
始终为true
。
第三个问题-即使if
条件始终为true
,因此始终返回Int
中的x
值,结果if
的{{1}}是Double
,因为if
语句必须返回单个类型。此示例尝试返回Int
或 Double
,因此将Int
的值扩展为Double
,以使类型匹配。 / p>
所以您要做的是不正确的。您希望它是一种或另一种。类型系统正在尝试实施折衷方案(Double
)。如果不可接受,则可以考虑将类型包装在Either
中。
val numPattern = "\\d*.?\\d+".r
val str = "50 units"
val dbl = numPattern.findFirstIn(str).fold(0.0)(_.toDouble)
val rslt :Either[Int,Double] = if (dbl.isValidInt) Left(dbl.toInt) else Right(dbl)
//rslt: Either[Int,Double] = Left(50)
答案 1 :(得分:0)
简单而棘手的人
val res = if (num(0).contains('.')) num(0).toDouble else num(0).toInt
或者您可以使用regex或scala.util.Try。
答案 2 :(得分:0)
您的分割不正确。如果字符串是50.2 units
,则num
将包含502
。您需要使用适当的正则表达式(如果存在,我只会检查字符串中的第一个数字并将其除以" "
)。
您可以这样做(解析并查找是int
还是double
)
val str = "50.2 units"
val numericRegex: String = ".*\\d+\\.?\\d+.*"
val numOT = Try((str.split(" ").filter(_.matches(numericRegex))).headOption.map(_.toDouble))
numOT match {
case Success(numO) =>
numO.fold {
println(s"no number exist in $str")
} { num =>
if ((num % 1) == 0) {
println("int")
} else {
println("double")
}
}
case Failure(error) => println("an error $error occcurs")
}
您可以here使用它