에 대한 문자열 입력의 유효성을 어떻게 확인 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을 사용하여 유효한 입력 문자 집합을 지정할 수 있습니다.
답변
이를 수행 할 수있는 몇 가지 방법이 있습니다.
- NSNumberFormatter의 numberFromString : 메소드를 사용하십시오. 문자열을 올바르게 구문 분석 할 수 있거나
nil
그렇지 않은 경우 NSNumber를 반환합니다 . - NSScanner 사용
- 숫자가 아닌 문자를 제거하고 문자열이 여전히 일치하는지 확인하십시오.
- 정규식 사용
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"];
}