如何使用Swift将UITextField限制在小数点以内?文本字段用于输入价格,因此我不能允许超过一个小数点。如果我使用的是Objective,我会使用以下代码:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSArray *sep = [newString componentsSeparatedByString:@"."];
if([sep count] >= 2)
{
NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
return !([sepStr length]>1);
}
return YES;
}
但是由于Swift使用范围的不同,我无法将此代码转换为Swift。第一行给出了一个错误:NSRange is not convertible to Range<String.Index>
编辑:,在我看到答案之前,我就这样做了:
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
let tempRange = textField.text.rangeOfString(".", options: NSStringCompareOptions.LiteralSearch, range: nil, locale: nil)
if tempRange?.isEmpty == false && string == "." {
return false
}
return true
}
我在另一个岗位上发现了这个。这个解决方案很好,但我不确定它是否是最好的方法,但它是一个简短和干净的方式。
发布于 2018-01-09 17:56:44
Swift 4& Xcode 9.2
此解决方案只允许输入一个小数点,因此允许使用有效的双小数点。
// Only allows one decimal point
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let arrayOfString = newString.components(separatedBy: ".")
if arrayOfString.count > 2 {
return false
}
return true
}
发布于 2014-08-10 08:45:19
Alexey在我之前就到了,但是看到我已经实现了一个Swift版本来检查事情,下面是:
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
// I'm explicitly unwrapping newString here, as I want to use reverse() on it, and that
// apparently doesn't work with implicitly unwrapped Strings.
if let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string) {
var decimalFound = false
var charactersAfterDecimal = 0
for ch in reverse(newString) {
if ch == "." {
decimalFound = true
break
}
charactersAfterDecimal++
}
if decimalFound && charactersAfterDecimal > 1 {
return false
}
}
return true;
}
注意,第一行现在显式地将textField.text转换为NSString。这是因为stringByReplacingCharactersInRange的字符串版本采用了Swift范围,而不是像传入的那样的NSRange。
我还使后面的代码更加Swiftian,删除了NSString操作。(我不认为这是非常有效的,因为反向( String )实际上可能逆转整个字符串,而不是提供一个简单的反向迭代器,但它看起来是最快速的方法。)
发布于 2014-08-10 08:30:18
您在Swift中的第一行如下:
var newString = NSString(string: textField.text).stringByReplacingCharactersInRange(range, withString: string)
https://stackoverflow.com/questions/25225904
复制相似问题