我正在编写的应用程序支持多种语言,但有1个文本字段,我希望用户仅在其中写ASCII数字(即无阿拉伯数字)和十进制分隔符。
我知道可以设置UITextfield
的{{1}},但不幸的是,有keyboardType
和.decimalPad
,但是asciiCapableNumberPad
都不适合我的需要, t带有小数点分隔符按钮,asciiCapableNumberPad
并不限制为ASCII数字。
是否可以使用decimalPad
?如果不是,将用户输入限制为asciiCapableDecimalPad
中仅以数字和小数点分隔的数字的最佳方法是什么?
答案 0 :(得分:1)
我没有发现立即用ASCII数字和小数点分隔符强制键盘的任何方法。在iPhone 8上,当用户只有阿拉伯语键盘时,对于仅带有东部阿拉伯数字(٠١٢٣٤٥٦٧٨٩)的.decimalPad
键盘将显示,当用户具有多个键盘(例如,英语键盘)时,用户将具有切换按钮以进行不同的更改数字。但这对于我的iPhone X家族来说是不正确的,我认为这是Apple方面的错误,切换按钮不存在。
我通过实现方法textField(_:shouldChangeCharactersIn:replacementString:)解决了这个问题,并在该方法内部将Eastern arabic numerals(阿拉伯语?)替换为ASCII数字(也称为Western arabic numberals),以验证键入期间输入的字符
result = [result stringByReplacingOccurrencesOfString:@"٠" withString:@"0"];
result = [result stringByReplacingOccurrencesOfString:@"١" withString:@"1"];
result = [result stringByReplacingOccurrencesOfString:@"٢" withString:@"2"];
result = [result stringByReplacingOccurrencesOfString:@"٣" withString:@"3"];
result = [result stringByReplacingOccurrencesOfString:@"٤" withString:@"4"];
result = [result stringByReplacingOccurrencesOfString:@"٥" withString:@"5"];
result = [result stringByReplacingOccurrencesOfString:@"٦" withString:@"6"];
result = [result stringByReplacingOccurrencesOfString:@"٧" withString:@"7"];
result = [result stringByReplacingOccurrencesOfString:@"٨" withString:@"8"];
result = [result stringByReplacingOccurrencesOfString:@"٩" withString:@"9"];
result = [result stringByReplacingOccurrencesOfString:@"٫" withString:@"."];
我在textFieldDidEndEditing:中也这样做。很有可能不需要执行此步骤,但是我也需要在失去焦点之后格式化数字。
此修复程序正在测试中,如果有任何问题,我会通知您。
答案 1 :(得分:0)
所有非拉丁字符串出现的Swift-5解决方案。
extension String {
var containsNonEnglishNumbers: Bool {
return !isEmpty && range(of: "[^0-9]", options: .regularExpression) == nil
}
var english: String {
return self.applyingTransform(StringTransform.toLatin, reverse: false) ?? self
}
}
用法-
textField.addTarget(self, action: #selector(didChangeText(field:)), for: .editingChanged)
@objc func didChangeText(field: UITextField) {
if ((field.text?.containsNonEnglishNumbers) != nil) {
field.text = field.text?.english
}
}