Objetivo C – iOS: verifique float / double

Estoy trabajando en la infame asignación de la calculadora de Stanford. Necesito verificar los numbers ingresados ​​para valores de flotación válidos, por lo que podemos manejar numbers como 102.3.79.

Para evitar tener que escribir un pequeño bucle para contar períodos en la cadena, debe haber una function incorporada sí?

Puede usar la function de biblioteca estándar C strtod() . Se detiene donde encuentra un error y establece su argumento de salida en consecuencia. Puede explotar este hecho de la siguiente manera:

 - (BOOL)isValidFloatString:(NSString *)str { const char *s = str.UTF8String; char *end; strtod(s, &end); return !end[0]; } 

Hay al less una solución bastante elegante para contar @"." en una cadena:

 NSString *input = @"102.3.79"; if([[input componentsSeparatedByString:@"."] count] > 2) { NSLog(@"input has too many points!"); } 

Excavando un poco más … Si está buscando validar toda la cadena como un número, intente configurar un NSNumberFormatter y llame a numberFromString: ( NSNumberFormatter documentation ).

Después de haber pasado por CS193P, creo que la idea es que se sienta cómodo con NSString y UILabel en lugar de usar C. UILabel tener una bandera BOOL punto decimal simple, mientras se presionan los botones y se están concatenando los numbers 1- para uso y 2- para mostrar.

Esto también será útil cuando realice otras comprobaciones, como colgar puntos decimales al final del número o permitir que el usuario retroceda un número.

Editado por ejemplo:

Cree una IBAction conectada a cada button numérico:

 - (IBAction)numberButtonPressed:(UIButton *)sender { if([sender.titleLabel.text isEqualToString:@"."]) { if (!self.inTheMiddleOfEnteringANumber) self.display.text=[NSString stringWithString:@"0."]; else if (!self.decimalPointEntenetworking) { self.display.text=[self.display.text stringByAppendingString:sender.titleLabel.text]; self.decimalPointEntenetworking=TRUE; } } self.inTheMiddleOfEnteringANumber=TRUE; } 
 -(BOOL) isNumeric:(NSString*)string { NSNumberFormatter *formatter = [NSNumberFormatter new]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; NSNumber *number = [formatter numberFromString:string]; [formatter release]; // if using ARC remove this line return number!=nil; } -(BOOL) isFloat:(NSString*)string { NSScanner *scanner = [NSScanner scannerWithString:string]; [scanner scanFloat:NULL]; return [scanner isAtEnd]; }