【问题标题】:How do I validate a Numeric character in scala? [duplicate]如何在 scala 中验证数字字符? [复制]
【发布时间】:2015-11-06 02:48:56
【问题描述】:

我的应用程序接受这样的字符串 (-110,23,-111.9543633) 我需要在 scala 脚本中验证/检索该字符串是否为数字?

【问题讨论】:

  • 请说明您是要转换为Int 还是Double,或者需要检查String 是否可以转换为具有隐式Numeric[_] 的类型
  • 假设我的输入是“111”,所以它的数字是我提出的一个标志,表示它的数字,或者如果输入像“-78”但如果我的输入像“111.67” " 我需要升旗为十进制。

标签: scala


【解决方案1】:

考虑scala.util.Try 在将字符串转换为数值时捕获可能的异常,如下所示,

Try("123".toDouble).isSuccess
Boolean = true

Try("a123".toDouble).isSuccess
Boolean = false

为了易用性,考虑这个隐含的,

implicit class OpsNum(val str: String) extends AnyVal {
  def isNumeric() = scala.util.Try(str.toDouble).isSuccess
}

因此

"-123.7".isNumeric
Boolean = true

"-123e7".isNumeric
Boolean = true

"--123e7".isNumeric
Boolean = false

【讨论】:

  • try catch 这样的检查是浪费资源,可以直接检查字符串
【解决方案2】:

假设您不仅想使用Try(x.toInt)Try(x.toFloat) 进行转换,而且实际上想要一个接受String 并返回true验证器,如果传递的String 可以是使用implicit evidence: Numeric[A] 转换为A

然后我会说:Afaik,这是不可能的。特别是,因为Numeric 没有密封。也就是说,您可以创建自己的 Numeric 实现

Int, Long, Float, Double 这样的原始类型可以使用正则表达式轻松提取。

【讨论】:

    【解决方案3】:

    我试过了,效果很好:

    val s = "-1112.12" s.isNumeric && (s.contains('.')==false)

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2023-02-22
      • 1970-01-01
      • 2012-02-24
      • 2013-04-26
      • 2012-09-10
      • 1970-01-01
      • 2016-03-19
      • 2020-03-19
      相关资源
      最近更新 更多