scala – 从字符串到数字类型的快速安全转换
发布时间:2020-12-16 18:46:57 所属栏目:安全 来源:网络整理
导读:将String转换为数字类型的快速安全方法是什么,而在转换失败时提供默认值? 我尝试使用通常推荐的方式,即使用例外: implicit class StringConversion(val s: String) { private def toTypeOrElse[T](convert: String=T,defaultVal: T) = try { convert(s) }
将String转换为数字类型的快速安全方法是什么,而在转换失败时提供默认值?
我尝试使用通常推荐的方式,即使用例外: 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,…方法触发的异常. 这可以通过检查字符串“是否属于给定类型”来实现? 解决方法
作为第一种方法,过滤掉那些不包含任何数字的输入字符串
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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |