java - Scala 与 Java toUpperCase/toLowerCase

标签 java scala locale case-sensitive scala.js

Scala 借用 Java String类似 toUpperCase 的方法/toLowerCase .

但是,其实现方式并不十分一致:

  • JVM 上的 Scala 与 Java 语义非常接近,因此:
    • toUpperCase() 是区域设置敏感的,并坚持默认区域设置(在土耳其语区域设置中会给你臭名昭著的 i → і 问题)
    • 为了避免这种情况并保持区域设置不敏感(类似 en_US/C)的过程,您需要专门执行 toUpperCase(Locale.ROOT)
  • Scala.JS 没有实现 Locale 的概念, 因此:
    • toUpperCase() 以区域设置不敏感的方式工作
    • toUpperCase(Locale locale) 方法在 ScalaJS 中实际上不可用

如何实现在 JVM/JS 上都能在 Scala 中工作的不区分区域设置的大小写转换?

我可以想到几种方法,但它们都很难看:

方法一:我自己的实现

针对英语字母表的 26 个 ASCII 字符实现我自己的 toUpperCase

方法 1.1:我自己使用 Scala 字符实现

基本相同,但至少重用了Scala toUpper转换单个字符。

方法2:接口(interface)

实现类似的东西

trait CaseChangeOps {
  def toUpperCase(s: String): String
}

object Main {
  var caseChanger: CaseChanger
}

// whenever I want to use it, do it like that:
Main.caseChanger.toUpperCase("like this") // => "LIKE THIS"

在共享代码中,然后在JS中有:

object CaseChangerJs {
  def toUpperCase(s: String): String = s.toUpperCase
}

object MainJs {
  Main.caseChanger = CaseChangerJs
}

...在 JVM 中:

object CaseChangerJvm {
  def toUpperCase(s: String): String = s.toUpperCase(Locale.ROOT)
}

object MainJvm {
  Main.caseChanger = CaseChangerJvm
}

方法3:引入外部scala-java-locales

有一个独特的第三方库 scala-java-locales ,它被列为 ScalaJS 兼容,可用于增强 ScalaJS。

不过,这看起来像是一个巨大的杀伤力,因为我实际上只需要区域设置不敏感大小写转换,而不是所有可能的区域设置的全部内容。

还有更好的想法吗?

最佳答案

标准方法与方法 2 接近,但简单得多。在共享代码中,您只需调用

Platform.toUpperLocaleInsensitive(string)

在 JVM 和 JS 上有不同的实现:

// JVM
object Platform {
  def toUpperLocaleInsensitive(s: String) = s.toUpperCase(Locale.ROOT)

  // other methods with different implementations
}

// JS
object Platform {
  def toUpperLocaleInsensitive(s: String) = s.toUpperCase()

  // other methods with different implementations
}

参见Hands-on Scala.js中类似案例的描述。

这是可行的,因为共享代码不需要自行编译,只需与特定于平台的代码一起编译即可。

关于java - Scala 与 Java toUpperCase/toLowerCase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60486347/

相关文章:

scala - 解释 scalaz-7 中的 Traverse[List] 实现

java - 匹配器查找第 n 个匹配索引

java - react native 任务:app:processDebugResources Failed to execute aapt

java - 带有 OneToMany 的 Spring Data Projection 返回太多结果

android - WebView打开后,Android默认语言环境更改

c - 使用带有千位分组格式(撇号)的 ICC 和 printf 的警告

android - Android 语言环境

java - "UCanAccess: user lacks privilege or object not found"第二个连接

斯卡拉玩 2.0。编译错误: IO error while decoding

scala - Scala中的A#B是什么意思