Este método:
- (BOOL)checkForDigits { NSString *editableExpression = self.expression.text; for (int i = 0; i < editableExpression.length; i++){ char charAtPosition = [editableExpression characterAtIndex:i]; for (int c = 0; c < 10; c++ ){ char digitAtPosition = digits[c]; if (charAtPosition == digitAtPosition){ return TRUE; } else { return FALSE; } } } }
siempre parece devolver FALSE y no puedo entender por qué. Habría utilizado el método isnan pero lo intenté y no funcionó, así que hice mi propio isnan (realmente lo contrario de isnan). La matriz de dígitos es solo
char digits[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
Utilizar esta:
- (BOOL)checkForDigits { char digits[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; BOOL result; NSString *editableExpression = @"dsjkdjk12lkv"; for (int i = 0; i < editableExpression.length; i++){ char charAtPosition = [editableExpression characterAtIndex:i]; for (int c = 0; c < 10; c++ ){ char digitAtPosition = digits[c]; if (charAtPosition == digitAtPosition){ NSLog(@"true"); return TRUE; } else { result = FALSE; } } } return result; }
De hecho, solo devolvía falso en el primer bucle. Entonces, el ciclo se ejecutaba solo para un ciclo.
Porque
charAtPosition
contiene una letra y un dígito como '1', '2',......
characterAtIndex Devuelve el carácter en una position de matriz dada.
¿Puede ser la mejor manera de utilizar el NSScanner?
NSScanner *scanner = [NSScanner scannerWithString:string]; NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"]; [scanner scanCharactersFromSet:numbers intoString:&obj1String]; obj1Num = [NSNumber numberWithInt:[obj1String integerValue]]; if(obj1String) { } else { }
Su editableExpression
no comienza desde el dígito.
NSString *editableExpression =@"A1" // return false NSString *editableExpression =@"1A" // return True //This will return TRUE if string contain digit - (BOOL)checkForDigits { NSString *editableExpression = @"1a1"; for (int i = 0; i < editableExpression.length; i++){ char charAtPosition = [editableExpression characterAtIndex:i]; for (int c = 0; c < 10; c++ ){ char digitAtPosition = digits[c]; if (charAtPosition == digitAtPosition){ return TRUE; } } } return FALSE; }
Prueba esto:
NSRange match = [string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet] options:0 range:NSMakeRange(0, string.length)]; if (match.location == NSNotFound) return NO; else return YES;
intente esto en su lugar:
BOOL containsDigits(NSString *s) { NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@"123456789"]; NSRange range = [s rangeOfCharacterFromSet:cs]; return range.location != NSNotFound; }
Modifíquelo a continuación
- (BOOL)checkForDigits { NSString *editableExpression = self.expression.text; BOOL isDigit = FALSE; for (int i = 0; i < editableExpression.length; i++){ char charAtPosition = [editableExpression characterAtIndex:i]; for (int c = 0; c < 10; c++ ){ char digitAtPosition = digits[c]; if (charAtPosition == digitAtPosition){ return TRUE; } } } return FALSE; }