gpt4 book ai didi

ios - 在 iOS 上获取小数点键盘的小数点分隔符

转载 作者:技术小花猫 更新时间:2023-10-29 11:07:44 25 4
gpt4 key购买 nike

我试图找出 iOS 中的小数点键盘使用哪个小数点分隔符,因此我可以使用 NumberFormatter 将用户输入的字符串转换为数字并返回。

因为我想用现有值预填充文本字段,所以我需要一个数字格式化程序,它使用与小数点键盘相同的小数点分隔符。


我的设备设置的语言(德语,德国)使用逗号作为小数点分隔符。我已将 iOS 配置为将德语键盘作为主要和事件键盘,并将英语(美国,QWERTY)作为辅助键盘。

我正在开发的应用只有基本本地化版本,即英语。在方案设置中,区域和语言设置为系统默认值。

如果我运行我的应用程序,小数点键盘使用的小数分隔符是“.”,这是 en-US 键盘使用的小数点分隔符,但不是 de-DE 键盘。普通字母键盘显示德语键盘布局。

如果我移除 iOS 设备上的 en-US 键盘,小数点分隔符会更改为“,”。


我怎样才能可靠地找出小数点键盘使用的是哪个小数点分隔符?

到目前为止,我尝试过的所有解决方案均无效:

  • 使用 NumberFormatter 的预设 decimalSeparator 总是给出“,”。
  • 使用 Locale.current.decimalSeparator 也始终返回“,”。
  • 使用 textField.textInputMode?.primaryLanguage 确定语言环境总是返回 de-DE
  • 使用 Bundle.main.preferredLocalizations 确定应用程序使用的本地化始终返回 en

这是数字格式化程序的配置方式:

let numberFormatter = NumberFormatter()
numberFormatter.minimumIntegerDigits = 1
numberFormatter.minimumFractionDigits = 0
numberFormatter.maximumFractionDigits = 2

编辑:似乎可以通过查找事件文本输入模式和应用程序本地化之间的匹配来确定小数点使用的语言环境:

let inputLocales = UITextInputMode.activeInputModes.compactMap {$0.primaryLanguage}.map(Locale.init(identifier:))
let localizations = Bundle.main.preferredLocalizations.map(Locale.init(identifier:))

let locale = inputLocales.flatMap { l in localizations.map {(l, $0)}}
.filter { preferredLanguage, preferredLocalization in
if preferredLocalization.regionCode == nil || preferredLanguage.regionCode == nil {
return preferredLanguage.languageCode == preferredLocalization.languageCode
} else {
return preferredLanguage == preferredLocalization
}
}
.first?.0
?? Locale.current

numberFormatter.locale = locale

但是这个解决方案有几个缺点:

  1. 我不知道 UIKit 是否正是按照这种方式选择小数点分隔符。某些语言的行为可能不同
  2. 每次格式化数字时都必须计算它,因为用户可能会在应用运行时更改键盘。

最佳答案

我的经验是,当您只支持英文本地化时,十进制键盘类型中的小数点分隔符将始终是 .。因此,当从字符串中解析数字时,您需要在 NumberFormatter 中强制使用 en_US 语言环境。

这是一个代码片段,它首先尝试使用 en_US 进行解析,然后尝试使用 Locale.current 进行解析。

func parseNumber(_ text:String) -> Double? {

// since we only support english localization, keyboard always show '.' as decimal separator,
// hence we need to force en_US locale
let fmtUS = NumberFormatter()
fmtUS.locale = Locale(identifier: "en_US")
if let number = fmtUS.number(from: text)?.doubleValue {
print("parsed using \(fmtUS.locale)")
return number
}

let fmtCurrent = NumberFormatter()
fmtCurrent.locale = Locale.current
if let number = fmtCurrent.number(from: text)?.doubleValue {
print("parsed using \(fmtCurrent.locale)")
return number
}

print("can't parse number")
return nil
}

如果 Apple 将 Locale.current 小数点分隔符添加为小数点键盘类型的小数点分隔符,我将不胜感激,否则我们需要为所有区域设置添加本地化才能正确执行此操作。

关于ios - 在 iOS 上获取小数点键盘的小数点分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51233517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com