我正在寻找一个代码,允许我在小数位前保留最多10个数字,在小数点后最多保存3个数字。
有效的例子是: 1234567899.123 - 十进制前最多10个数字和小数点后3个数字。
123.123 - 小数点前少于10个数字好。
123456.1 - 小数点后少于3个数字。
123 - 好的
我在下面使用此功能:
-(BOOL)textField: (UITextField*)tectField shouldChangeCharactersInRange: (NSRange)range replacementString:(NSString*) string {
NSString *newStrn = [textField.text stringReplacingCharactersInRange: range withString: string];
NSArray *arrayofStrn = [newStrn componentsSeparatedByString:@"."]; //to keep only one decimal
if([arrayofStrn count]> 2) {
return NO;
}
else {
return YES;
}
}
不知道如何进一步保持十进制前10个数字(小于10个)的最大限制和小数点后3个数字的最大限制(小于3个数字或小数点后没有数字)。
非常感谢你们!
答案 0 :(得分:5)
你可以通过像这样的简单正则表达式来实现这个目标
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
NSString *editedString = [textField.text stringReplacingCharactersInRange:range withString:string];
NSString *regex = @"\\d{0,10}(\\.\\d{0,3})?"
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:editedString];
}
我已使用以下输入测试了上述内容
@"1234567891", //=> YES
@"12345678912", //=> NO
@"1234567891.122", //=> YES
@"1234567891.1234", //=> NO
@".123", //=> YES
答案 1 :(得分:0)
在你的else语句中添加以下内容:
if([arrayofStrn count] < 2) {
if ([[arrayofStrn objectAtIndex:0] length] > 10) {
//Bad
} else {
//Good
}
} else {
if ([[arrayofStrn objectAtIndex:0] length] > 10 || [[arrayofStrn objectAtIndex:1] length] > 3) {
//Bad
} else {
//Good
}
}
就像注释一样,你可以像这样检索NSString的长度:
theString.length or [theString length]
答案 2 :(得分:0)
这里是Xcode 10和Swift 4.2
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == txt_Amount{
let amountString: NSString = textField.text! as NSString
let newString: NSString = amountString.replacingCharacters(in: range, with: string) as NSString
let regex = "\\d{0,6}(\\.\\d{0,2})?"
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
return predicate.evaluate(with:newString)
}
return true
}