मेरे पास एक UITextView
है जिसमें मैं स्पेस-सीमांकित संख्याओं की एक श्रृंखला टाइप करता हूं (उदाहरण के लिए: "12.3 30 22.7 19.23 15 8.5 11")।
UITextView
में कई दशमलव बिंदु हो सकते हैं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि किसी भी व्यक्तिगत संख्या में एक से अधिक दशमलव स्थान न हों।
मेरे द्वारा खोजे गए सभी समाधान केवल संपूर्ण UITextView
को एक दशमलव तक सीमित करते हैं, प्रत्येक संख्या को नहीं।
मैं यह कैसे कर सकता हूँ?
4 जवाब
अंतिम परिणाम:
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
}
आप 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
जैसे फंक्शन में इस्तेमाल किया जा सकता है
मुझे लगता है कि आपको इस प्रतिनिधि टेक्स्टफिल्ड (_: shouldChangeCharactersIn:replacementString :) का उपयोग करना चाहिए और अपने आप से प्रत्येक नंबर की जांच करें और जांचें कि पहले से ही बिंदु था या नहीं। और झूठी या सच्ची वापसी करें।
टेक्स्ट व्यू प्रतिनिधि विधि में नियमित अभिव्यक्ति का प्रयास करें:
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
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
ios
iOS, Apple iPhone, iPod टच और iPad पर चलने वाला मोबाइल ऑपरेटिंग सिस्टम है। IOS प्लेटफॉर्म पर प्रोग्रामिंग से संबंधित प्रश्नों के लिए इस टैग [ios] का उपयोग करें। उन प्रोग्रामिंग भाषाओं के लिए विशिष्ट मुद्दों के लिए संबंधित टैग [उद्देश्य-सी] और [स्विफ्ट] का उपयोग करें।