UITextField在小数位前保留最多10个数字,在小数点后最多保存3个数字

时间:2014-05-30 20:21:21

标签: ios objective-c

我正在寻找一个代码,允许我在小数位前保留最多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个数字或小数点后没有数字)。

非常感谢你们!

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
}