如何从 swift 中的 UItextfield 读取特定格式 ( XXX.X )?
How to read a specific format ( XXX.X ) from UItextfield in swift?
我想用 XXX.X format.Suppose 从 swift 的文本字段中读取文本 XXX.X 格式 我的意思是:
- 123.3 有效
- 48.2 有效
- 1.4 有效
- 4 个有效
- 4.3.4 无效
- 5555.5 无效
- 123.34 无效
换句话说,句点左侧的文本最多只能有 3 个字符,如果用户没有输入“.”,则左侧的文本只能有 1 个字符或根本没有字符。
目前,我的代码仅适用于限制“.”的数量
func textField(textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
{
let countdots = textField.text.components(separatedBy: ".").count)! - 1
if countdots > 0 && string == "."
{
return false
}
return true
}
尝试这样的事情(正则表达式可能是错误的你需要自己修复它)
-(BOOL)isValidValue:(NSString *)checkString{
NSString *stricterFilterString = @"^[0-9]{1,3}[.][0-9]{1}";
NSPredicate *valueTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stricterFilterString];
return [valueTest evaluateWithObject:checkString];
}
测试:
NSLog(@"%@", [self isValidValue:@"123.3"] ? @"YES" : @"NO");
[更新]
对于 Swift 3:
func valueCheck(_ checkString: String) -> Bool {
var result = false
do {
let regex = try RegularExpression(pattern: "^[0-9]{1,3}[.][0-9]{1}", options: [])
let results = regex.matches(in: checkString, options: [], range: NSMakeRange(0, checkString.characters.count))
if results.count > 0 {
return true
} else {
return false
}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
}
return false
}
func valid(_ s:String) -> Bool {
func roundToPlaces(value:Double, places:Int) -> Double {
let divisor = pow(10.0, Double(places))
return round(value * divisor) / divisor
}
if let num = Double(s) {
if num >= 1000.0 {
return false
}
if roundToPlaces(value:num, places:1) != num {
return false
}
return true
} else {
return false
}
}
测试您的输入:
let test = [
"123.3",
"48.2",
"1.4",
"4",
"4.3.4",
"5555.5",
"123.34"
]
for s in test {
print(valid(s))
}
结果:
true
true
true
true
false
false
false
这就是你的输入和你想要的输出。
我想用 XXX.X format.Suppose 从 swift 的文本字段中读取文本 XXX.X 格式 我的意思是:
- 123.3 有效
- 48.2 有效
- 1.4 有效
- 4 个有效
- 4.3.4 无效
- 5555.5 无效
- 123.34 无效
换句话说,句点左侧的文本最多只能有 3 个字符,如果用户没有输入“.”,则左侧的文本只能有 1 个字符或根本没有字符。
目前,我的代码仅适用于限制“.”的数量
func textField(textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
{
let countdots = textField.text.components(separatedBy: ".").count)! - 1
if countdots > 0 && string == "."
{
return false
}
return true
}
尝试这样的事情(正则表达式可能是错误的你需要自己修复它)
-(BOOL)isValidValue:(NSString *)checkString{
NSString *stricterFilterString = @"^[0-9]{1,3}[.][0-9]{1}";
NSPredicate *valueTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stricterFilterString];
return [valueTest evaluateWithObject:checkString];
}
测试:
NSLog(@"%@", [self isValidValue:@"123.3"] ? @"YES" : @"NO");
[更新]
对于 Swift 3:
func valueCheck(_ checkString: String) -> Bool {
var result = false
do {
let regex = try RegularExpression(pattern: "^[0-9]{1,3}[.][0-9]{1}", options: [])
let results = regex.matches(in: checkString, options: [], range: NSMakeRange(0, checkString.characters.count))
if results.count > 0 {
return true
} else {
return false
}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
}
return false
}
func valid(_ s:String) -> Bool {
func roundToPlaces(value:Double, places:Int) -> Double {
let divisor = pow(10.0, Double(places))
return round(value * divisor) / divisor
}
if let num = Double(s) {
if num >= 1000.0 {
return false
}
if roundToPlaces(value:num, places:1) != num {
return false
}
return true
} else {
return false
}
}
测试您的输入:
let test = [
"123.3",
"48.2",
"1.4",
"4",
"4.3.4",
"5555.5",
"123.34"
]
for s in test {
print(valid(s))
}
结果:
true
true
true
true
false
false
false
这就是你的输入和你想要的输出。