Swift中的计算器方法[rangeOfString]

时间:2015-04-03 12:19:43

标签: objective-c swift

我正在使用Swift为IOS 8制作计算器。所有操作数和运算符都能很好地工作。唯一的问题是“。”

例如,192.168.0.1无效。 “。”应该只显示一次。而是192.16801有效。

见下面的代码 -

//Assume user has entered 192.168
//User cannot press "." button again now, "." should not appear again
var display.text 192.168`        
if display.text.rangeOfString(".") != nil{
    println("exists")
}

4 个答案:

答案 0 :(得分:0)

我不确定这是个问题,但如果您正在寻找第二个“。”,您可以使用find函数,并在此处使用:

let decimal: Character = "."
if let first = find(display.text, decimal)
    where (find(display.text[first.successor()..<display.text.endIndex], decimal) != nil)  {
    println("second exists")
}
else {
    println("none or one")
}

答案 1 :(得分:0)

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    //Textfield delegates
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return NO to not change text

        switch string {
        case "0","1","2","3","4","5","6","7","8","9":
            return true
        case ".":
            let array = Array(textField.text)
            var decimalCount = 0
            for character in array {
                if character == "." {
                    decimalCount++
                 }
            }

            if decimalCount == 1 {
                return false
            } else {
                return true
            }
        default:
            let array = Array(string)
            if array.count == 0 {
                return true
            }
            return false
        }
    }
}

如果输入了有效数字,textField函数将返回true值,如果输入的数字不是数字,或者输入第二个“。”,它将返回false值。如果此函数返回false,则更改文本字段的值。示例:如果用户(尝试)输入3.14a9,则将忽略a,文本字段文本将为3.149。如果用户输入3.45.12,则文本字段的文本值为3.45.12

答案 2 :(得分:0)

只要值的值发生变化,您就可以使用正则表达式验证文本字段。

监管机构的例子

/*
^                       //begin string
([0-9]+)?               //optional: has 0 or more digits
(\\.)?                  //optional: has a point
([0-9]+)?               //optional: has 0 or more digits
$                       //end string
*/
extension String {
    func isValidNumber() -> Bool {
        let regex = NSRegularExpression(pattern: "^([0-9]+)?(\\.)?([0-9]+)?$", options: .CaseInsensitive, error: nil)
        return regex?.firstMatchInString(self, options: nil, range: NSMakeRange(0, countElements(self))) != nil
    }
}

用于UITextField的回调:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        return textField.text.isValidNumber()
}

答案 3 :(得分:0)

var text = "192.168.2"

var isValid = true
let range = text.rangeOfString(".")
if let range = range {
    let subText = text.substringFromIndex(range.endIndex)
    let range2 = subText.rangeOfString(".")
    if range2 != nil {
        isValid = false    
    }
}

println("isValid: \(isValid)") // isValid: false