81 votos

iPhone cómo comprobar que un string es sólo numérico

¿Cómo puedo validar la cadena de entrada de un UITextField? Quiero comprobar que la cadena es numérico, incluyendo decimales.

115voto

Donal O'Danachair Puntos 1028

Usted puede hacerlo en un par de líneas como esta:

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

-- esto es para validar la entrada es numéricos caracteres solamente. Vistazo a la documentación para NSCharacterSet para el resto de las opciones. Usted puede utilizar characterSetWithCharactersInString para especificar el conjunto de caracteres de entrada.

71voto

Dave DeLong Puntos 156978

Hay un par de maneras que usted podría hacer esto:

  1. Uso NSNumberFormatter del numberFromString: método. Esto devolverá un NSNumber si se puede analizar la cadena correctamente, o nil si no se puede hacer.
  2. Uso NSScanner
  3. Tira de cualquier carácter no numérico y ver si la cadena sigue los partidos de
  4. El uso de una expresión regular

IMO, el uso de algo como -[NSString doubleValue] no sería la mejor opción, ya que tanto @"0.0" y @"abc" tendrá un doubleValue de 0. El *valor de métodos devuelven 0 si no son capaces de convertir la cadena correctamente, por lo que sería difícil distinguir entre una legítima cadena de @"0" y un no-válido de cadena. Algo como C, strtol función tendría el mismo problema.

Creo que el uso de NSNumberFormatter sería la mejor opción, ya que toma en cuenta la configuración regional (es decir, la cantidad @"1,23" en Europa, frente @"1.23" en los EE.UU.).

34voto

Peter N Lewis Puntos 12025

Yo uso este código en mi Mac de la aplicación, la misma o similar deberá funcionar con el iPhone. Se basa en la RegexKitLite expresiones regulares y convierte el texto en rojo cuando su no válido.

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]];
    }
}

19voto

Frank Shearar Puntos 12481

Si desea que un usuario sólo será autorizado a entrar en números, usted puede hacer su ViewController poner en práctica parte de UITextFieldDelegate y definir este método:

- (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];
}

Probablemente hay maneras más eficientes, pero esto me parece una muy conveniente forma. Y el método debe ser fácilmente adaptable a la validación de dobles o lo que sea: sólo tiene que utilizar scanDouble: o similares.

13voto

kalpesh jetani Puntos 326
#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;
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X