如果是整数则将数字转换为int,否则转换为float

时间:2019-06-20 04:46:28

标签: scala

我正在尝试从字符串中获取一个数字,然后检查它是否为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")
}

这是我尝试过的代码。问题是即使条件为真,我也会将数字转换为两倍。有人可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

第一个问题-您正在分割非数字字符,因此它将在点.上分割,您将永远得不到正确的Double值。

第二个问题-xy变量将总是相等的,因为它们都来自相同的数字字符串。 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使用它