मेरे पास एक UITextView है जिसमें मैं स्पेस-सीमांकित संख्याओं की एक श्रृंखला टाइप करता हूं (उदाहरण के लिए: "12.3 30 22.7 19.23 15 8.5 11")।

UITextView में कई दशमलव बिंदु हो सकते हैं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि किसी भी व्यक्तिगत संख्या में एक से अधिक दशमलव स्थान न हों।

मेरे द्वारा खोजे गए सभी समाधान केवल संपूर्ण UITextView को एक दशमलव तक सीमित करते हैं, प्रत्येक संख्या को नहीं।

मैं यह कैसे कर सकता हूँ?

1
Greg 22 अक्टूबर 2020, 23:53

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
}
0
Greg 26 जिंदा 2021, 01:29

आप 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 जैसे फंक्शन में इस्तेमाल किया जा सकता है

1
user 23 अक्टूबर 2020, 01:22

मुझे लगता है कि आपको इस प्रतिनिधि टेक्स्टफिल्ड (_: shouldChangeCharactersIn:replacementString :) का उपयोग करना चाहिए और अपने आप से प्रत्येक नंबर की जांच करें और जांचें कि पहले से ही बिंदु था या नहीं। और झूठी या सच्ची वापसी करें।

0
Ec7ipse 23 अक्टूबर 2020, 00:44

टेक्स्ट व्यू प्रतिनिधि विधि में नियमित अभिव्यक्ति का प्रयास करें:

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

0
Zathras 23 अक्टूबर 2020, 02:28