2011-02-07 2 views
1

この特定の文字列に対してスキャナを動作させることに問題があります。NSScannerが「isAtEnd」に達しない、またはフルストリングをスキャンしない

ここにコードを付属しています。

tempString = @"30.15 in. Hg (1021 hPa)"; 
scanner = [NSScanner scannerWithString:tempString]; //setting the scanning location, 
[scanner setCharactersToBeSkipped:[[NSCharacterSet characterSetWithCharactersInString:@".,-+ "]invertedSet]]; 
value = 0; 
_i = 0; 
while([scanner isAtEnd] == NO) 
{ 
    [scanner scanFloat:&value]; 
    if(_i == 1) 
    { 
     pressure = value; 
    } 
    _i++; 
} 
NSLog(@"pressure = %f hpa",pressure); 

この無限ループは...

私は、文字列を変更した場合:tempString = @"30.15 in 8.8 Hg (1021 hPa)";

私が変更された場合、それはまた、細かい

の作品with:tempString = @"30.15 in Hg (1021 hPa)";

iまた、うまく動作します。

問題は「。

この作業を行うにはどんなクリーンな解決策ですか?

ありがとうございます。

答えて

2

-scanFloat:が有効かどうかをチェックして、有効なフロートがスキャンされているかどうかを確認できます。キャラクタがNOを返す場合は、キャラクタをスキップします。

while (![scanner isAtEnd]) { 
    if ([scanner scanFloat:&value]) { 
     if(_i == 1) { 
     pressure = value; 
     } 
     _i++; 
    } else { 
     [scanner setScanLocation:[scanner scanLocation] + 1]; 
    } 
} 
+1

パーフェクト!それが私が探求したものです!どうもありがとう。 – Vassily

0
tempString = @"30.15 in. Hg (1021 hPa)"; 
scanner = [NSScanner scannerWithString:tempString]; 
[scanner scanUpToString:@"(" intoString:nil]; 
[scanner scanString:@"(" intoString:nil]; 
[scanner scanFloat:&value]; 
+0

ありがとう、これは確かに問題を取り巻く良い方法です。また、私はそれが動作する方法を理解してうれしいでしょう:なぜドット "。スキャナが停止するか、またはスキャナがwhileループの最後に到達しない理由を確認してください。 – Vassily

+1

'-scanFloat:'を呼び出すと、スキャナは現在の位置に10進数があるかどうかをチェックします。存在する場合、渡された引数にこの番号を置き、番号の後に現在の位置を移動し、YESを返します。有効な番号がない場合、NOを返し、位置を変更しません。オリジナルのループでは、ドットをスキャンしようとし続けますが、ドットは有効な数字ではないため、常に失敗します。実際には、[NSScannerの参考文献](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSScanner_Class/Reference/Reference.html)をご覧ください。 –

関連する問題