快速 安全将String转换为数字类型的方式是什么,而转换失败时提供默认值?
我尝试使用通常推荐的方式,即使用Exceptions:
implicit class StringConversion(val s: String) {
private def toTypeOrElse[T](convert: String=>T, defaultVal: T) = try {
convert(s)
} catch {
case _: NumberFormatException => defaultVal
}
def toShortOrElse(defaultVal: Short = 0) = toTypeOrElse[Short](_.toShort, defaultVal)
def toByteOrElse(defaultVal: Byte = 0) = toTypeOrElse[Byte](_.toByte, defaultVal)
def toIntOrElse(defaultVal: Int = 0) = toTypeOrElse[Int](_.toInt, defaultVal)
def toDoubleOrElse(defaultVal: Double = 0D) = toTypeOrElse[Double](_.toDouble, defaultVal)
def toLongOrElse(defaultVal: Long = 0L) = toTypeOrElse[Long](_.toLong, defaultVal)
def toFloatOrElse(defaultVal: Float = 0F) = toTypeOrElse[Float](_.toFloat, defaultVal)
}
使用此实用程序类,我现在可以轻松地将任何String转换为给定的数字类型,并在String未正确表示数字类型时提供默认值:
scala> "123".toIntOrElse()
res1: Int = 123
scala> "abc".toIntOrElse(-1)
res2: Int = -1
scala> "abc".toIntOrElse()
res3: Int = 0
scala> "3.14159".toDoubleOrElse()
res4: Double = 3.14159
...
虽然它工作得很漂亮,但这种方法似乎不能很好地扩展,可能是因为Exceptions机制:
scala> for (i<-1 to 10000000) "1234".toIntOrElse()
大致 1秒执行而
scala> for (i<-1 to 10000000) "abcd".toIntOrElse()
大约 1分钟!
我想另一种方法是避免依赖于toInt,toDouble,...方法触发的异常。
这可以通过检查字符串“是否属于给定类型”来实现吗? 当然可以迭代字符串字符并检查它们是否为数字(参见例如this example),但那么其他数字格式(double,float,hex,octal,...)呢?
答案 0 :(得分:1)
作为第一种方法,过滤掉那些不包含任何数字的输入字符串
private def toTypeOrElse[T](convert: String=>T, defaultVal: T) = try {
if (s.contains("[0-9]")) convert(s) {
else defaultVal
} catch {
case _: NumberFormatException => defaultVal
}
}
<强>更新强>
可能出现在数值中的丰富字符集,但没有考虑重复的出现顺序或限制,
private def toTypeOrElse[T](convert: String=>T, defaultVal: T) = try {
if (s matches "[\\+\\-0-9.e]+") convert(s)
else defaultVal
} catch {
case _: NumberFormatException => defaultVal
}
}