Альтернативное решение, использующее метод .query () :
In [5]: df.query("countries in @countries")
Out[5]:
countries
1 UK
3 China
In [6]: df.query("countries not in @countries")
Out[6]:
countries
0 US
2 Germany
Столкнулся с той же проблемой в Swift.
В Swift вы должны использовать этот код в соответствии с ответом TomSwift:
func isAllDigits(str: String) -> Bool {
let nonNumbers = NSCharacterSet.decimalDigitCharacterSet()
if let range = str.rangeOfCharacterFromSet(nonNumbers) {
return true
}
else {
return false
}
}
P.S. Также вы можете использовать другие наборы NSCharacterSets или их комбинации для проверки вашей строки!
Что-то вроде этого будет работать:
@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
, тогда просто используйте это так:
NSString* hasOtherStuff = @"234 other stuff";
NSString* digitsOnly = @"123345999996665003030303030";
BOOL b1 = [hasOtherStuff isAllDigits];
BOOL b2 = [digitsOnly isAllDigits];
Вам не нужно включать функциональность в расширение для частной категории, как это , но это, безусловно, облегчает повторное использование ..
Мне нравится это решение лучше, чем другие, так как оно никогда не переполняет некоторые int / float, которые сканируются с помощью NSScanner - количество цифр может быть практически любой длины.
Вот так:
- (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");
}
}
Для простых чисел, таких как «12234» или «231231.23123», ответ может быть простым.
Существует закон преобразования для целых чисел: когда строка с целым числом преобразуется в целое (или длинное) число, а затем снова преобразует его в другую строку, эти строки будут равны.
В Задаче C это будет выглядеть следующим образом:
NSString *numStr=@"1234",*num2Str=nil;
num2Str=[NSString stringWithFormat:@"%lld",numStr.longlongValue];
if([numStr isEqualToString: num2Str]) NSLog(@"numStr is an integer number!");
Используя этот закон преобразования, мы можем создать решение
для обнаружения double
или 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");
Я не копировал приведенный выше код из своего рабочего кода, поэтому могут быть некоторые ошибки, но я думаю, что главное ясно. Конечно, это решение не работает с числами типа «1E100», а также не учитывает размер целой и дробной части. Используя закон, описанный выше, вы можете выполнять любое обнаружение числа.
С. Джонс ответил неверно. Если вы используете средство форматирования, вы рискуете, что Apple в какой-то момент изменит свою кодовую базу и заставит средство форматирования выпустить частичный результат. Том тоже не прав. Если вы используете метод rangeOfCharacterFromSet и проверяете наличие NSNotFound, он зарегистрирует значение true, если строка содержит хотя бы одно число. Аналогичным образом, другие ответы в этой теме предлагают использовать метод целочисленных значений. Это также неправильно, потому что он зарегистрирует true, если в строке присутствует хотя бы одно целое число. ОП запросил ответ, который гарантирует, что вся строка является числовой. Попробуйте это:
NSCharacterSet *searchSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
Том был прав насчет этой части. Этот шаг дает вам нечисловые строковые символы. Но затем мы делаем это:
NSString *trimmedString = [string stringByTrimmingCharactersInSet:searchSet];
return (string.length == trimmedString.length);
Перевернутый набор символов Тома может TRIM строку. Таким образом, мы можем использовать этот метод обрезки, чтобы проверить, существуют ли какие-либо не цифры в строке, сравнивая их длины.
Рассмотрим NSString integerValue
- он возвращает NSInteger
. Однако он будет принимать некоторые строки, которые не являются полностью числовыми, и не предоставляет механизм для определения строк, которые не являются числовыми вообще. Это может или не может быть приемлемым.
Например, " 13 " -> 13
, "42foo" -> 42
и "helloworld" -> 0
.
Удачного кодирования.
Теперь, поскольку вышеизложенное было своего рода касательной к вопросу, см. , чтобы определить, является ли строка числовой . Код взят по ссылке, с добавлением комментариев:
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;
}
Выше работает только с scanFloat
- например, нет scanInt
- потому что диапазон с плавающей точкой намного больше , чем у целого (даже 64-битного целого).
Эта функция проверяет «полностью числовые» и принимает "42"
и "0.13E2"
, но отклоняет " 13 "
, "42foo"
и "helloworld"
.