1-ая проблема - Вы разделяетесь на нецифровые символы, поэтому оно разделяется на точку .
, и вы никогда не получите правильное значение Double
.
2-ая задача - Переменные x
и y
будут всегда равны, потому что они обе взяты из одной и той же строки цифр.50 == 50.0
всегда true
.
3-я проблема - Даже если условие if
всегда true
и, следовательно, всегда возвращает значение Int
в x
результат if
равен Double
, поскольку оператор if
должен возвращать один тип.Этот пытается вернуть Int
или a Double
, поэтому значение Int
увеличивается до Double
, так что типы совпадают.
Так что вы 'пытаться сделать это необоснованно.Вы хотите, чтобы это был один тип или другой.Система типов пытается навязать компромисс (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)