我如何验证UITextField
的字符串输入?我想检查字符串是否为数字,包括小数点。
我如何验证UITextField
的字符串输入?我想检查字符串是否为数字,包括小数点。
你可以像这样用几行代码实现:
BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:myInputField.text];
valid = [alphaNums isSupersetOfSet:inStringSet];
if (!valid) // Not numeric
-- 该部分用于验证输入是否仅为数字字符。查看NSCharacterSet
文档以了解其他选项。您可以使用characterSetWithCharactersInString方法来指定任何一组有效的输入字符。
nil
。-[NSString doubleValue]
的方法可能不是最好的选择,因为@"0.0"
和@"abc"
都具有0的doubleValue。 *value方法如果无法正确转换字符串,则全部返回0,因此难以区分合法的@"0"
字符串和非有效的字符串。类似于C的strtol
函数也会出现相同的问题。@"1,23"
与在美国使用的数字@"1.23"
)。NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; NSNumber * n = [f numberFromString:@"34jfkjdskj80"]; NSLog(@"N: %@", n);
。现在我给你翻译了原文,请查看。 - Dave DeLongNSNumberFormatter
一样,NSScanner
在解析字符串时会考虑区域设置,只要您在扫描器对象上使用 setLocale:
(例如,您可以提供 [NSLocale currentLocale]
)。 - dreamlax我在我的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)TextIsValidValue:(NSString *)newText :(double *)value
... - RCIX(?:|0|[1-9]\\d*)(?:\\.\\d*)
以查看它的含义。此外,可以参考正则表达式维基百科页面。 - mfaani如果您希望用户只能输入数字,您可以使您的视图控制器实现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;
}
#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"];
}
那将使键盘看起来像这样:
唯一要做的就是确保用户不输入两个小数位。您可以在用户编辑时完成此操作。将以下代码添加到您的视图控制器中。该代码会在第二个小数位被输入时立即将其删除。对用户来说,似乎第二个小数位从未出现过。- (void)viewDidLoad
{
[super viewDidLoad];
[self.textField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldDidChange:(UITextField *)textField
{
NSString *text = textField.text;
NSRange range = [text rangeOfString:@"."];
if (range.location != NSNotFound &&
[text hasSuffix:@"."] &&
range.location != (text.length - 1))
{
// There's more than one decimal
textField.text = [text substringToIndex:text.length - 1];
}
}
NSString *string=@"1.22";
double a=[string doubleValue];
我认为如果字符串无效,这将返回0.0(它可能会抛出异常,在这种情况下,您可以捕获它,但文档中说是0.0)。更多信息在此处
虽然有些晚了,但我这里有一个非常实用的小技巧,可以考虑到小数点和本地符号。链接到它的代码片段在这里
@interface NSString (Extension)
- (BOOL) isAnEmail;
- (BOOL) isNumeric;
@end
@implementation NSString (Extension)
/**
* Determines if the current string is a valid email address.
*
* @return BOOL - True if the string is a valid email address.
*/
- (BOOL) isAnEmail
{
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:self];
}
/**
* Determines if the current NSString is numeric or not. It also accounts for the localised (Germany for example use "," instead of ".") decimal point and includes these as a valid number.
*
* @return BOOL - True if the string is numeric.
*/
- (BOOL) isNumeric
{
NSString *localDecimalSymbol = [[NSLocale currentLocale] objectForKey:NSLocaleDecimalSeparator];
NSMutableCharacterSet *decimalCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:localDecimalSymbol];
[decimalCharacterSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSCharacterSet* nonNumbers = [decimalCharacterSet invertedSet];
NSRange r = [self rangeOfCharacterFromSet: nonNumbers];
if (r.location == NSNotFound)
{
// check to see how many times the decimal symbol appears in the string. It should only appear once for the number to be numeric.
int numberOfOccurances = [[self componentsSeparatedByString:localDecimalSymbol] count]-1;
return (numberOfOccurances > 1) ? NO : YES;
}
else return NO;
}
@end