sistema - iphone almacenamiento lleno y no tengo nada
¿Cómo comprobar si NSString contiene un valor numérico? (7)
Algo como esto funcionaría:
@interface NSString (usefull_stuff)
- (BOOL) isAllDigits;
@end
@implementation NSString (usefull_stuff)
- (BOOL) isAllDigits
{
NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
NSRange r = [self rangeOfCharacterFromSet: nonNumbers];
return r.location == NSNotFound && self.length > 0;
}
@end
entonces solo úsalo así:
NSString* hasOtherStuff = @"234 other stuff";
NSString* digitsOnly = @"123345999996665003030303030";
BOOL b1 = [hasOtherStuff isAllDigits];
BOOL b2 = [digitsOnly isAllDigits];
No tiene que envolver la funcionalidad en una extensión de categoría privada como esta, pero seguro que facilita la reutilización.
Me gusta esta solución mejor que las demás, ya que no se desbordará alguna vez int / float que se está escaneando a través de NSScanner - la cantidad de dígitos puede ser de casi cualquier longitud.
Tengo una cadena que se está generando a partir de una fórmula, sin embargo, solo quiero usar la cadena siempre que todos sus caracteres sean numéricos, de lo contrario, quiero hacer algo diferente, por ejemplo, mostrar un mensaje de error.
He estado mirando a mi alrededor pero me resulta difícil encontrar algo que funcione de acuerdo con lo que quiero hacer. He consultado NSScanner, pero no estoy seguro de si está comprobando toda la cadena y no estoy seguro de cómo comprobar si estos caracteres son numéricos.
- (void)isNumeric:(NSString *)code{
NSScanner *ns = [NSScanner scannerWithString:code];
if ( [ns scanFloat:NULL] ) //what can I use instead of NULL?
{
NSLog(@"INSIDE IF");
}
else {
NSLog(@"OUTSIDE IF");
}
}
Entonces, después de unas horas más de búsqueda, me he topado con una implementación que dosifica exactamente lo que estoy buscando.
así que si está buscando verificar si hay algún carácter alfanumérico en su NSString esto funciona aquí
-(bool) isNumeric:(NSString*) hexText
{
NSNumberFormatter* numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
NSNumber* number = [numberFormatter numberFromString:hexText];
if (number != nil) {
NSLog(@"%@ is numeric", hexText);
//do some stuff here
return true;
}
NSLog(@"%@ is not numeric", hexText);
//or do some more stuff here
return false;
}
espero que esto ayude.
Ante el mismo problema en Swift.
En Swift debes usar este código, según la respuesta de TomSwift:
func isAllDigits(str: String) -> Bool {
let nonNumbers = NSCharacterSet.decimalDigitCharacterSet()
if let range = str.rangeOfCharacterFromSet(nonNumbers) {
return true
}
else {
return false
}
}
PS ¡También puedes usar otros NSCharacterSets o sus combinaciones para comprobar tu cadena!
Considere NSString integerValue
- devuelve un NSInteger
. Sin embargo, aceptará algunas cadenas que no son del todo numéricas y no proporciona un mecanismo para determinar cadenas que no sean en absoluto numéricas. Esto puede o no ser aceptable.
Por ejemplo, " 13 " -> 13
, "42foo" -> 42
y "helloworld" -> 0
.
Feliz codificación.
Ahora, dado que lo anterior era una especie de tangente a la pregunta, vea cómo determinar si la cadena es numérica . Código tomado del enlace, con comentarios agregados:
BOOL isNumeric(NSString *s)
{
NSScanner *sc = [NSScanner scannerWithString: s];
// We can pass NULL because we don''t actually need the value to test
// for if the string is numeric. This is allowable.
if ( [sc scanFloat:NULL] )
{
// Ensure nothing left in scanner so that "42foo" is not accepted.
// ("42" would be consumed by scanFloat above leaving "foo".)
return [sc isAtEnd];
}
// Couldn''t even scan a float :(
return NO;
}
Lo anterior funciona solo con scanFloat
, por ejemplo, no scanInt
, porque el rango de un flotador es mucho mayor que el de un entero (incluso un entero de 64 bits).
Esta función busca "totalmente numérico" y aceptará "42"
y "0.13E2"
pero rechazará " 13 "
, "42foo"
y "helloworld"
.
Es muy sencillo.
+ (BOOL)isStringNumeric:(NSString *)text
{
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:text];
return [alphaNums isSupersetOfSet:inStringSet];
}
La respuesta de C.John es incorrecta. Si utiliza un formateador, corre el riesgo de que Apple cambie su base de código en algún momento y que el formateador arroje un resultado parcial. La respuesta de Tom es incorrecta también. Si usa el método rangeOfCharacterFromSet y verifica NSNotFound, registrará un verdadero si la cadena contiene un solo número. De manera similar, otras respuestas en este hilo sugieren el uso del método de valor Integer. Eso también es incorrecto porque registrará un verdadero si incluso un entero está presente en la cadena. El OP solicitó una respuesta que asegure que toda la cadena sea numérica. Prueba esto:
NSCharacterSet *searchSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
Tom tenía razón sobre esta parte. Ese paso te da los caracteres de cadena no numéricos. Pero luego hacemos esto:
NSString *trimmedString = [string stringByTrimmingCharactersInSet:searchSet];
return (string.length == trimmedString.length);
El conjunto de caracteres invertido de Tom puede RECORTAR una cadena. Por lo tanto, podemos usar ese método de recorte para probar si existen números no numéricos en la cadena comparando sus longitudes.
Me gusta esto:
- (void)isNumeric:(NSString *)code{
NSScanner *ns = [NSScanner scannerWithString:code];
float the_value;
if ( [ns scanFloat:&the_value] )
{
NSLog(@"INSIDE IF");
// do something with `the_value` if you like
}
else {
NSLog(@"OUTSIDE IF");
}
}
Para números simples como "12234" o "231231.23123" la respuesta puede ser simple.
Existe una ley de transformación para los números int: cuando la cadena con un entero se transforma en un número int (o largo) y luego, nuevamente, la transforma de nuevo en otra cadena, estas cadenas serán iguales.
En Objective C se verá como:
NSString *numStr=@"1234",*num2Str=nil;
num2Str=[NSString stringWithFormat:@"%lld",numStr.longlongValue];
if([numStr isEqualToString: num2Str]) NSLog(@"numStr is an integer number!");
Usando esta ley de transformación podemos crear una solución.
Para detectar números double
o long
:
NSString *numStr=@"12134.343"
NSArray *numList=[numStr componentsSeparatedByString:@"."];
if([[NSString stringWithFormat:@"%lld", numStr.longLongValue] isEqualToString:numStr]) NSLog(@"numStr is an integer number");
else
if( numList.count==2 &&
[[NSString stringWithFormat:@"%lld",((NSString*)numList[0]).longLongValue] isEqualToString:(NSString*)numList[0]] &&
[[NSString stringWithFormat:@"%lld",((NSString*)numList[1]).longLongValue] isEqualToString:(NSString*)numList[1]] )
NSLog(@"numStr is a double number");
else
NSLog(@"numStr is not a number");
No copié el código anterior de mi código de trabajo, por lo que puede haber algunos errores, pero creo que el punto principal es claro. Por supuesto, esta solución no funciona con números como "1E100", y tampoco tiene en cuenta el tamaño del entero y la parte fraccionaria. Al utilizar la ley descrita anteriormente, puede hacer cualquier detección de números que necesite.