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

Scala 如果是整数,则将数字转换为int,否则转换为float,scala,Scala,我试图从字符串中提取一个数字,然后检查它是int还是double。如果它是一个整数,那么我将使用将数字转换为int。如果不是,则使用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

我试图从字符串中提取一个数字,然后检查它是int还是double。如果它是一个整数,那么我将使用
将数字转换为int
。如果不是,则使用
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")
}
这是我尝试过的代码。问题是,即使条件为真,我也会将数字转换为双精度。有人能解决这个问题吗

简单而棘手的一个

val res=if(num(0).包含('.')num(0).toDouble else num(0).toInt
或者您可以使用regex或scala.util.Try.

简单而棘手的方法

val res=if(num(0).包含('.')num(0).toDouble else num(0).toInt

或者您可以使用regex或scala.util.Try.

第一个问题-您正在对非数字字符进行拆分,因此它将在点上拆分,并且您将永远无法获得正确的
双值

第二个问题-
x
y
变量总是相等的,因为它们都来自同一个数字串
50==50.0
始终为
true

3rd problem-尽管
if
条件始终为
true
,因此总是在
x
中返回
Int
值,但是
if
的结果是
Double
,因为
if
语句必须返回单个类型。这个函数试图返回一个
Int
Double
,因此
Int
值被加宽为
Double
,以便类型匹配

所以你想做的是不合理的。您希望它是一种类型还是另一种类型。类型系统正在尝试执行折衷(
Double
)。如果这是不可接受的,你可以考虑在<代码>中包装你的类型< < /代码> .<
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)

1st problem-您正在对非数字字符进行拆分,因此它将在点
上拆分,并且您将永远无法获得正确的
双精度值

第二个问题-
x
y
变量总是相等的,因为它们都来自同一个数字串
50==50.0
始终为
true

3rd problem-尽管
if
条件始终为
true
,因此总是在
x
中返回
Int
值,但是
if
的结果是
Double
,因为
if
语句必须返回单个类型。这个函数试图返回一个
Int
Double
,因此
Int
值被加宽为
Double
,以便类型匹配

所以你想做的是不合理的。您希望它是一种类型还是另一种类型。类型系统正在尝试执行折衷(
Double
)。如果这是不可接受的,你可以考虑在<代码>中包装你的类型< < /代码> .<
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)

你的分割不正确。如果字符串为
50.2个单位
num
将包含
502
。您需要使用一个合适的正则表达式(我只检查字符串中的第一个数字,如果它存在的话,我会将它除以
“”

您可以这样做(解析并查找是
int
还是
double


你可以玩它

你的分割不正确。如果字符串为
50.2个单位
num
将包含
502
。您需要使用一个合适的正则表达式(我只检查字符串中的第一个数字,如果它存在的话,我会将它除以
“”

您可以这样做(解析并查找是
int
还是
double


你可以玩它

你能举例说明预期的输入/输出吗?对于哪种类型的输入,很难确定您的预期输出。您能给出预期输入/输出的示例吗?对于哪种输入,很难弄清楚你的预期输出是什么。我明白了。谢谢你的详细解释,我明白了。谢谢你的详细解释。