【发布时间】:2020-10-22 20:53:28
【问题描述】:
我有一个UITextView,我在其中输入了一系列以空格分隔的数字(例如:“12.3 30 22.7 19.23 15 8.5 11”)。
UITextView 可能包含多个小数点,但我想确保没有单个数字包含超过一个小数位。
我发现的所有解决方案仅将整个 UITextView 限制为一个小数,而不是每个数字。
我该怎么做?
【问题讨论】:
我有一个UITextView,我在其中输入了一系列以空格分隔的数字(例如:“12.3 30 22.7 19.23 15 8.5 11”)。
UITextView 可能包含多个小数点,但我想确保没有单个数字包含超过一个小数位。
我发现的所有解决方案仅将整个 UITextView 限制为一个小数,而不是每个数字。
我该怎么做?
【问题讨论】:
您可以在 UITextView 委托 func shouldEndEditing.. 中尝试类似的操作。
func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
guard let numbers = textView.text else {
return true
}
var hasMultipleDecimalPlaces: Bool = false
let numbersAsList = numbers.split(separator: " ")
for number in numbersAsList {
let splitAtDecimal = number.split(separator: ".")
if splitAtDecimal.count > 2 {
if splitAtDecimal[1].count > 2 {
// This is what you want to prevent so break early and return false
hasMultipleDecimalPlaces = true
break
}
}
}
return !hasMultipleDecimalPlaces
}
这将阻止用户完成对文本视图的编辑。它总是可以用在像shouldReplaceCharactersIn这样的函数中
【讨论】:
我认为您应该使用此委托 textField(_:shouldChangeCharactersIn:replacementString:) 并自行检查每个数字并检查是否已经存在点。并返回 false 或 true。
【讨论】:
在文本视图委托方法中尝试正则表达式:
let regex = try! NSRegularExpression(pattern: "^\\s*((-?)(\\d+\\.?|\\d*\\.\\d+))?(\\s+(-?)(\\d+\\.?|\\d*\\.\\d+))*\\s*$")
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// Compute the value of the text view after the text is inserted.
let finalText = (textView.text as NSString).replacingCharacters(in: range, with: text) as NSString
// Check against a regular expression.
return regex.firstMatch(in: finalText as String, range: NSRange(location: 0, length: finalText.length)) != nil
}
您将不得不尝试您想要的行为: https://regex101.com
【讨论】:
最终结果:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// only allow valid characters
let validCharacters = " -0123456789.,|\t\n"
guard CharacterSet(charactersIn: validCharacters).isSuperset(of: CharacterSet(charactersIn: text)) else {
return false
}
let oldText = txtViewDataInput.text!
let r = Range(range, in: oldText)
let text = oldText.replacingCharacters(in: r!, with: text)
debugPrint("text = \(text)")
let whiteSpace = " ,|\t\n"
let separators = NSCharacterSet(charactersIn: whiteSpace)
let tempArray = text.components(separatedBy: separators as CharacterSet)
// do not allow more than one decimal point in a number
for number in tempArray {
let splitAtDecimal = number.filter { $0 == "." }.count
if splitAtDecimal > 1 {
return false
}
}
return true
}
【讨论】: