Scala 如果是整数,则将数字转换为int,否则转换为float
我试图从字符串中提取一个数字,然后检查它是int还是double。如果它是一个整数,那么我将使用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
。如果不是,则使用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
)
你可以玩它你能举例说明预期的输入/输出吗?对于哪种类型的输入,很难确定您的预期输出。您能给出预期输入/输出的示例吗?对于哪种输入,很难弄清楚你的预期输出是什么。我明白了。谢谢你的详细解释,我明白了。谢谢你的详细解释。