【问题标题】:Iphone UITextField only integerIphone UITextField 只有整数
【发布时间】:2010-04-27 08:18:03
【问题描述】:

我的 IB 中有一个 UITextField,我想检查用户是否只输入了数字(没有字符)并获取整数值。

我得到 UITextField 的整数值:

int integer = [myUITexrtField.text intValue];

当我输入一个字符 ( , ; . ) 时,它返回 0,我不知道如何检测它不仅仅是数字。

我该怎么办?

【问题讨论】:

  • 将键盘类型更改为数字类型..

标签: iphone objective-c casting


【解决方案1】:

如下实现 shouldChangeCharactersInRange 方法不允许用户输入非数字字符。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0) || [string isEqualToString:@""];
}

如果字符串是数字,则返回 YES,否则返回 NO。 [string isEqualToString@""] 是支持退格键删除。

我喜欢这种方法,因为它很干净。

【讨论】:

  • 启用删除:return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0) || [字符串 isEqualToString:@""];
  • 唯一的问题是如果用户粘贴一个字符串,例如1n1a, stringByTrimmingCharactersInSet: 只会从字符串的开头和结尾移除。执行以下操作: NSRegularExpression *numbersOnly = [NSRegularExpression regularExpressionWithPattern:@"[0-9]+" options:NSRegularExpressionCaseInsensitive error:&error]; NSInteger numberOfMatches = [numbersOnly numberOfMatchesInString:string options:0 range:NSMakeRange(0, string.length)]; if (numberOfMatches != 1 && string.length != 0) { shouldChange = NO; }
  • @mbogh 的评论应该是答案。
  • 或者,您可以将第二行更改为return [string stringByTrimmingCharactersInSet:numbers].length == string.length;
【解决方案2】:

请务必设置您的文本字段委托

使用以下功能确保用户只能输入数字:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber* candidateNumber;

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

    range = NSMakeRange(0, [candidateString length]);

    [numberFormatter getObjectValue:&candidateNumber forString:candidateString range:&range error:nil];

    if (([candidateString length] > 0) && (candidateNumber == nil || range.length < [candidateString length])) {

        return NO;
    }
    else 
    {
        return YES;
    }
}

【讨论】:

  • 如果输入的第一个字符是字母,这将不起作用。如果先输入一个数字,然后再输入一个字母,它就可以了。
【解决方案3】:

试试这个:它将阻止用户输入除数字以外的任何字符

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];

   if ([string rangeOfCharacterFromSet:nonNumberSet].location != NSNotFound) 
   {
       return NO;
   }
   return YES;
}

【讨论】:

  • 2 年前提供并接受了一个答案。除非您有实质性的补充,否则请不要回答这些已经回答过的老问题。
  • 你的回答对之前的回答有什么补充?为什么它很有价值,你认为应该是一个答案?这个问题已经有几个高票数的答案,为什么你的不同?
  • 这是一个非常快速的解决方案。不要忘记将 textField 委托添加到 .h 文件
【解决方案4】:

http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Objective-C

或者您可以确保当焦点位于字段上时仅显示数字键盘

【讨论】:

  • 依赖数字键盘并不安全,因为用户可能会将字符串数据粘贴到字段中,而不是使用键盘。
  • 最后一个答案更准确
【解决方案5】:

只允许数字输入:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    return [string isEqualToString:@""] || 
        ([string stringByTrimmingCharactersInSet:
            [[NSCharacterSet decimalDigitCharacterSet] invertedSet]].length > 0);
}

测试一个整数:

- (BOOL)isNumeric:(NSString *)input {
    for (int i = 0; i < [input length]; i++) {
        char c = [input characterAtIndex:i];
        // Allow a leading '-' for negative integers
        if (!((c == '-' && i == 0) || (c >= '0' && c <= '9'))) {
            return NO;
        }
    }
    return YES;
}

【讨论】:

    【解决方案6】:

    @devsan 的回答不正确。如果用户粘贴带有诸如“1abc”之类的数字的任何内容,她的代码就会中断

    应该是(仅当所有字符都是数字时才允许替换):

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length == string.length) || [string isEqualToString:@""];
    }
    

    【讨论】:

      【解决方案7】:

      你也可以使用 UITextFieldDelegate 方法

      textField:shouldChangeCharactersInRange:replacementString:

      实时检查用户每次按键是一个简单的数字,以便他/她知道该字段中只输入int值。

      【讨论】:

        【解决方案8】:

        是否也希望允许 数字?

        详细说明 davsan 的答案,这是一个支持输入 负数 和正数的解决方案,并且不允许输入任何其他内容。

        - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
        {
            NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
            return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0) || [string isEqualToString:@""] || ([textField.text isEqualToString:@""] && [string isEqualToString:@"-"]);
        
            return YES;
        }
        

        【讨论】:

          【解决方案9】:

          此代码也适用于本地化。

            - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
              {
                  if([string isEqualToString:@""]) return YES;
                  NSCharacterSet *characterSet = nil;
                  characterSet = [NSCharacterSet decimalDigitCharacterSet];
                  NSRange location = [string rangeOfCharacterFromSet:characterSet];
                  return (location.location != NSNotFound);
          
                  if(characterSet == nil) return YES;
                  return YES;
          
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-11
            • 1970-01-01
            • 1970-01-01
            • 2011-03-18
            • 2011-04-09
            • 1970-01-01
            相关资源
            最近更新 更多