scala ..要检查的方式不是字符上的数字

时间:2018-03-28 15:33:54

标签: scala digit

我需要像这样进行字符转换: accountNumber => ACCOUNT_NUMBER

如果有大写字母,请在下划线前加上前缀。如果没有,只需将角色大写

我试过以下

scala> "accountNumber".map{ x => x match { case x if x == x.toUpper => "_"+x ; case x if x!= x.toUpper => x.toUpper}}.mkString
res38: String = ACCOUNT_NUMBER 

它有效,但当它们之间有数字时,它的工作方式不同。

scala> "filler51".map{ x => x match { case x if x == x.toUpper && x.isDigit && true => "_"+x ; case x if x!= x.toUpper => x.toUpper}}.mkString 
res31: String = FILLER_5_1

我希望它能打印FILLER51。为此,我调整了下面的代码,但是我收到了错误。

 scala> "filler51".map{ x => x match { case x if x == x.toUpper && !(x.isDigit)   => "_"+x ; case x if x!= x.toUpper => x.toUpper}}.mkString  
scala.MatchError: 5 (of class java.lang.Character)
  at .$line40$$read$$$anonfun$1(<console>:12)
  at .$line40$$read$$$anonfun$1$adapted(<console>:12)
  at $$Lambda$1399/645018917.apply(Unknown Source)
  at ap(StringOps.scala:29)
     ... 28 elided

3 个答案:

答案 0 :(得分:1)

你几乎就在那里 - 只需要一个包罗万象来覆盖所有情况,因为你的两个匹配案例并没有用尽所有可能性(即isDigit的情况):

"thisFiller51".map { x => x match { 
  case x if x == x.toUpper && !x.isDigit => "_" + x
  case x if x != x.toUpper => x.toUpper
  case x => x
} }.mkString  
// res1: String = THIS_FILLER51

答案 1 :(得分:0)

请使用以下方法

scala> "filler51".map(x=>if(x>='A' && x<='Z') '_'.toString+x.toString else x.toString)
                 .mkString
                 .toUpperCase

结果:

res6: String = FILLER51

答案 2 :(得分:0)

而不是测试!= upper,测试显式更低:

"filler51".map {x => x match {case x if x == x.toUpper && !(x.isDigit) => "_" + x; case x if x == x.toLower => x.toUpper}}.mkString