[objective-c] UITextField에 대한 입력이 숫자 전용인지 확인

에 대한 문자열 입력의 유효성을 어떻게 확인 UITextField합니까? 문자열이 소수점을 포함하여 숫자인지 확인하고 싶습니다.



답변

이 코드를 Mac 앱에서 사용합니다. 동일하거나 유사한 코드가 iPhone에서도 작동합니다. RegexKitLite 정규식을 기반으로하며 유효하지 않은 경우 텍스트를 빨간색으로 바꿉니다.

static bool TextIsValidValue( NSString* newText, double &value )
{
    bool result = false;

    if ( [newText isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) {
        result = true;
        value = [newText doubleValue];
    }
    return result;
}

- (IBAction) doTextChanged:(id)sender;
{
    double value;
    if ( TextIsValidValue( [i_pause stringValue], value ) ) {
        [i_pause setTextColor:[NSColor blackColor]];
        // do something with the value
    } else {
        [i_pause setTextColor:[NSColor redColor]];
    }
}


답변

다음과 같이 몇 줄로 할 수 있습니다.

BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:myInputField.text];
valid = [alphaNums isSupersetOfSet:inStringSet];
if (!valid) // Not numeric

-이것은 입력이 숫자 문자인지 확인하기위한 것입니다. NSCharacterSet다른 옵션 에 대해서는 설명서를 참조 하십시오. characterSetWithCharactersInString을 사용하여 유효한 입력 문자 집합을 지정할 수 있습니다.


답변

이를 수행 할 수있는 몇 가지 방법이 있습니다.

  1. NSNumberFormatter의 numberFromString : 메소드를 사용하십시오. 문자열을 올바르게 구문 분석 할 수 있거나 nil그렇지 않은 경우 NSNumber를 반환합니다 .
  2. NSScanner 사용
  3. 숫자가 아닌 문자를 제거하고 문자열이 여전히 일치하는지 확인하십시오.
  4. 정규식 사용

IMO, 같은 것을 사용하는 것이 -[NSString doubleValue]최선의 선택을하지 않을 것입니다 모두 때문에 @"0.0"그리고 @"abc"그들은 구별하기 어려울 것이다, 그래서 제대로 문자열을 변환 할 수없는 경우 * 값 방법에게 0의 모든 반환 0있는 doubleValue이있을 것이다 의 합법적 인 문자열 @"0"과 유효하지 않은 문자열입니다. C의 strtol기능 과 같은 것에는 동일한 문제가 있습니다.

NSNumberFormatter를 사용하는 것이 가장 좋은 옵션이라고 생각합니다. 로케일을 고려하기 때문입니다 (예 : @"1,23"유럽과 @"1.23"미국 의 숫자 ).


답변

사용자가 숫자 만 입력 할 수 있도록하려면 ViewController가 UITextFieldDelegate의 일부를 구현하도록하고 다음 메서드를 정의 할 수 있습니다.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string];

  // The user deleting all input is perfectly acceptable.
  if ([resultingString length] == 0) {
    return true;
  }

  NSInteger holder;

  NSScanner *scan = [NSScanner scannerWithString: resultingString];

  return [scan scanInteger: &holder] && [scan isAtEnd];
}

더 효율적인 방법이있을 수 있지만이 방법 이 매우 편리 합니다. 그리고 방법은 복식의 유효성을 검사하는 데 쉽게 적용 할 수 있어야합니다. scanDouble : 또는 이와 유사한 것을 사용하십시오.


답변

#pragma mark - UItextfield Delegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([string isEqualToString:@"("]||[string isEqualToString:@")"]) {
        return TRUE;
    }

    NSLog(@"Range ==%d  ,%d",range.length,range.location);
    //NSRange *CURRANGE = [NSString  rangeOfString:string];

    if (range.location == 0 && range.length == 0) {
        if ([string isEqualToString:@"+"]) {
            return TRUE;
        }
    }
    return [self isNumeric:string];
}

-(BOOL)isNumeric:(NSString*)inputString{
    BOOL isValid = NO;
    NSCharacterSet *alphaNumbersSet = [NSCharacterSet decimalDigitCharacterSet];
    NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:inputString];
    isValid = [alphaNumbersSet isSupersetOfSet:stringSet];
    return isValid;
}


답변

다음은 위의 Peter Lewis의 답변 ( UITextField에 대한 입력이 숫자로만 확인 )을 NSPredicates와 결합한 몇 가지 한 줄입니다.

    #define REGEX_FOR_NUMBERS   @"^([+-]?)(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"
    #define REGEX_FOR_INTEGERS  @"^([+-]?)(?:|0|[1-9]\\d*)?$"
    #define IS_A_NUMBER(string) [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_NUMBERS] evaluateWithObject:string]
    #define IS_AN_INTEGER(string) [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_INTEGERS] evaluateWithObject:string]


답변

정수 테스트의 경우 다음과 같습니다.

- (BOOL) isIntegerNumber: (NSString*)input
{
    return [input integerValue] != 0 || [input isEqualToString:@"0"];
}