web-dev-qa-db-ja.com

NSStringに数値が含まれているかどうかを確認するにはどうすればよいですか?

数式から生成される文字列がありますが、すべての文字が数値である場合にのみ文字列を使用します。そうでない場合は、たとえばエラーメッセージを表示するなど、何か別のことを行います。

私は一見していたが、自分のやりたいことに沿って機能するものを見つけるのが難しい。私はNSScannerを見ましたが、それが文字列全体をチェックしているかどうかわからないので、これらの文字が数字であるかどうかを確認する方法が実際にはわかりません

- (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");
    }
}

そのため、さらに数時間検索した後、私が探しているものを正確に実行する実装に遭遇しました。

nSStringに英数字が含まれているかどうかを確認する場合は、ここで機能します

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

お役に立てれば。

31
C.Johns

このような何かがうまくいくでしょう:

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

このようなプライベートカテゴリ拡張で機能をラップする必要はありませんが、再利用が容易になります。

NSScannerを介してスキャンされているint/floatをオーバーフローしないため、他のソリューションよりもこのソリューションが優れています。桁数はほとんどすべての長さにすることができます。

52
TomSwift

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"は拒否します。

15
user166390

このような:

- (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");
    }
}
8
Matt Connolly

とても簡単です。

+ (BOOL)isStringNumeric:(NSString *)text
{
    NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
    NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:text];        
    return [alphaNums isSupersetOfSet:inStringSet];
}
7
arturdev

Swiftで同じ問題に直面しました。
In Swiftでは、TomSwiftの回答によると、このコードを使用する必要があります。

func isAllDigits(str: String) -> Bool {

    let nonNumbers = NSCharacterSet.decimalDigitCharacterSet()

    if let range = str.rangeOfCharacterFromSet(nonNumbers) {
        return true
    }
    else {
        return false
    }
}

追伸また、他のNSCharacterSetsまたはそれらの組み合わせを使用して、文字列をチェックすることもできます!

2

「12234」や「231231.23123」のような単純な数値の場合、答えは単純です。

Int数には変換の法則があります。整数を持つ文字列がint(またはlong)数に変換された後、再度、別の文字列に変換すると、これらの文字列は等しくなります。

Objective 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"のような数値では機能しません。また、整数と小数部のサイズも考慮していません。上記の法則を使用することにより、必要な数の検出を行うことができます。

0
sinoptic

C.ジョンズの答えは間違っています。フォーマッタを使用する場合、Appleある時点でコードベースを変更し、フォーマッタが部分的な結果を出力するようにする危険があります。Tomの答えも間違っています。rangeOfCharacterFromSetメソッドを使用してNSNotFoundをチェックする場合、文字列に1つでも数値が含まれている場合はtrueを登録します。同様に、このスレッドの他の回答は整数値メソッドの使用を提案しています。文字列に整数が1つでも存在する場合はtrueを登録するため、これも誤りです。 OPは、全体文字列が数値であることを確認する回答を求めました。これを試してください:

NSCharacterSet *searchSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];

トムはこの部分について正しかった。そのステップにより、非数値の文字列文字が得られます。しかし、次にこれを行います。

NSString *trimmedString = [string stringByTrimmingCharactersInSet:searchSet];

return (string.length == trimmedString.length);

トムの反転文字セットは文字列をトリムできます。そのため、このtrimメソッドを使用して、長さを比較することにより、文字列に非数値が存在するかどうかをテストできます。

0