我正在使用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")
}
答案 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