我需要像这样进行字符转换:
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
答案 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