限制文本字段输入只有一个小数点。

7
我创建了一个文本字段,用于输入货币金额。我希望用户只能输入一个小数点。我在-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string方法中实现了这一点。
通常情况下,它可以正常工作,但如果按下退格键并删除单个小数点,则之后仍然假定已输入小数点,因此不再接受小数点。
当通过按下退格键删除小数点时,我需要重置decimalPointEntered标志。如何实现?

我在这个答案中解决了这个问题。请查看以下链接: https://dev59.com/E4bca4cB1Zd3GeqPactD#44655025 - Shah Nilay
10个回答

10

这对我来说很好用。尝试使用以下代码:

-(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;
}

1
我认为大多数欧洲国家使用逗号,但在英国我们使用句点。在德国,你会看到1.000,00美元,而在英国和美国,我们会写成$1,000.00。这些差异对编码来说很烦人,但并不像在德国键盘上打字那样困难,因为Y和Z键被交换了! - Josh

8
以下是我所使用的内容:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (!numberFormatter) {
        numberFormatter = [[NSNumberFormatter alloc]init];
        //[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

    }
    NSNumber *test = [numberFormatter numberFromString:[self.text stringByAppendingString: string]];  // in case we entered two decimals

    return (test != nil);

}

4
我限制用户输入的金额应该像这样:
  • 用户只能输入0-9和小数点.字符
  • 只允许一个小数点字符
  • 小数点前最多5位数字
  • 小数点后最多2位数字

40543.48

所以我按照这种方式更新了shouldChangeCharactersInRange方法。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   {

    if (textField == self.txtFieldTransferAmount)
    {
        NSString *updatedText = [textField.text stringByReplacingCharactersInRange:range withString:string];
        NSArray *stringsArray = [updatedText componentsSeparatedByString:@"."];

        // Before decimal only 5 digit allowed
        if (stringsArray.count > 0)
        {
            NSString *dollarAmount = stringsArray[0];
            if (dollarAmount.length > 5)
                return NO;
        }

        // After decimal only 2 digit allowed
        if (stringsArray.count > 1)
        {
            NSString *centAmount = stringsArray[1];
            if (centAmount.length > 2)
                return NO;
        }

        // Only one . decimal allowed
        if (stringsArray.count > 2)
            return NO;

        if (textField.text.length < 8) {
            //User should able to enter only 0-9 and . characters
            NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
            NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
            return [string isEqualToString:filtered];
        }
        else
        {
            if (range.length > 0)
            {
                return true;
            }
            else{
                return false;
            }
        }
    }
    return true;
}

3
我有一个非常类似的解决方案。对我来说效果更好。它还可以验证文本输入。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSLog(@"in shouldChangeCharactersInRange");


    if([string length]==0){
        return YES;
    }

    //Validate Character Entry
    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789,."];
    for (int i = 0; i < [string length]; i++) {
        unichar c = [string characterAtIndex:i];

        if ([myCharSet characterIsMember:c]) {

            //now check if string already has 1 decimal mark
            NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
            NSArray *sep = [newString componentsSeparatedByString:@"."];
            NSLog(@"sep: %@ count: %d" ,sep,[sep count]);
            if([sep count]>2) return NO;
            return YES;

        }

    }

    return NO;
}

2

希望这能帮助到某些人..

NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        // if . at the beggining
        if ([newString isEqualToString:@"."] && newString.length== 1) {
            textField.text = @"0.";
            return NO;
        }

        // do not allow . more then once
        NSArray *components = [newString componentsSeparatedByString:@"."];
        if([components count] > 2)
        {
            return NO;
        }

1
我总是更喜欢使用正则表达式来解决这种情况,而不是基于代码规则的方法。
要限制一个小数点和其后一位字符,请使用以下内容;
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
   // Only allow one decimal point and 1 digit after it
   NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
   NSString *expression = @"^[0-9]$*((\\.|,)[0-9]{0,1})?$";
   NSError *error = nil;
   NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error];
   NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString options:0 range:NSMakeRange(0, [newString length])];
   return numberOfMatches != 0;
   return YES;
 }

上述代码将确保文本字段仅包含一个小数点和一个小数点后的字符。
您可以使用这个正则表达式进行操作,并根据您的要求创建规则。

1

尝试这个,这是一段Swift代码,但你可以参考其逻辑:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {


    if(string == "." ){
        let countdots = textField.text!.componentsSeparatedByString(".").count - 1

        if countdots > 0 && string == "."
        {
            return false
        }
    }
    return true 
}

1

0
我使用这种方法将小数位数限制为一个,并允许用户输入负数金额(即用于折扣):
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890.-"] invertedSet];
if ([string rangeOfCharacterFromSet:cs].location == NSNotFound) {

    NSString *newString = [[textField text] stringByReplacingCharactersInRange:range withString:string];

    // check number of decimal chars used (maximum of one)
    NSArray *array = [newString componentsSeparatedByString:@"."];
    if ([array count] <= 2) {

        // check negative chars (maximum of one AND it must be at the front)
        array = [newString componentsSeparatedByString:@"-"];

        if (1 == [array count]) {
            return YES; // no negatives
        } else if (2 == [array count]) {
            return ('-' == [newString characterAtIndex:0]); // return YES if first char is negative only
        } else {
            return NO; // too many negative chars
        }
    } else {
        return NO; // too many decimal chars
    }
} else {
    return NO; // invalid character
}

0

这是最简单的方法。


-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSArray *explodedNumbersArray = [newString componentsSeparatedByString:@"."];
// 我们检查数组是否有3个或更多项,这意味着它有2个或更多的小数位 // 如果发生这种情况,我们返回NO,以便文本字段不会识别输入 if([explodedNumbersArray count] >= 3) { return NO; }
return YES; }

注意:确保应该接收委托通知的视图或视图控制器符合UITextFieldDelegate。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接