2009-08-27 1 views
0

BradのCorePlotでは、このスニペットを見たので、コーヒーの必要がなくなりました。NSScannerはNSDecimalをスキャンする文字列をどのように想定していますか?

NSDecimal result; 
NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation]; 
[theScanner scanDecimal:&result]; 

Appleは言う:私は今、完全に目を覚ましてよ

スキャナのロケールは、それが は、文字列から値を解釈する方法に影響を与えます。 特に、スキャナは、整数および浮動小数点の小数部 表現を区別 にロケールの小数点を使用します。新しいスキャナの ロケールはデフォルトではnilであり、 はローカライズされていない値を使用します。

So:NSScannerインスタンスを作成してロケールを指定しないと、単純なソースコードで入力した場合と同じように、文字列が表す10進数値が予想されます。

i.E. @ " - 59933845504572.944882211"または@ "123.456789"または@ "145.002e33"または@ "145.002e-33"?それは正しいでしょうか?

答えて

0

NSScannerは、その文字列でNSDecimalNumberを初期化したのと同じ方法で、文字列から数値を抽出します。 NSDecimalNumberのルールに従って、解析できる内容を調べることができます。

アップルの "String Programming Guide for Cocoa"のscanners sectionによると、ローカリゼーションはユーザーのロケールに基づいて行われます。手動で小数点記号を指定する場合は、setLocale:を使用してこれを変更できます。

NSDecimalNumber *newNumber = [[NSDecimalNumber alloc] initWithString:@"1.0" locale:[NSLocale currentLocale]]; 
newDecimal = [newNumber decimalValue]; 
[newNumber release]; 

NSScannerはNSDecimalNumberだけで307000をした秒、あたり約582000の変換をした:それは、次のようなコードでNSDecimalNumberを使用するよりもはるかに高速だったので

は、我々は文字列からNSDecimalを初期化するためにNSScannerを使用しました私のMac。

+0

ありがとうございました。しかし、一つのこと。ドキュメントには、「新しいスキャナのロケールはデフォルトではnilであり、ローカライズされていない値を使用するようになっています。それは、ユーザーのロケールに関係なく、ハードコードされた文字列に対してスキャナが機能するということではありませんか?それとも、アメリカのロケールを指定することで本当に安全ですか? –

+0

私は分かりません。 iPhone Simulator(またはMac)で米国とドイツのロケールの両方でアプリケーションを実行し、小数点記号の変更が問題なく処理されるかどうかを確認することで、これをテストできます。 –

+0

良いアイデア。新しい単語 "ヒッチ"を学んだ。それもありがとう、;-) –

関連する問題