0

簡単な電卓アプリを作ろうとしています。現在、アプリは完全に動作します。1つの問題:結果をフォーマットされた数値(800000 = 800,000)に変更するのに十分賢いですが、完全な式(200 * 600/21000 = 200 * 600 / 21,000)には変更できません。

文字列をフィードして、文字列内に操作を残したまま、適切にフォーマットされた数値の文字列を取得できるメソッドが必要です。

例:

メソッド30000/80^2をフィードします。メソッドは30,000/80^2を返します。

編集:人々は質問を誤解しているようです(または私が答えを誤解している可能性があります!)私は数字を分離できるようにしたいです-60000/200000は60000と200000に分離します。私はそこからそれを行うことができます。

4

2 に答える 2

1

さて、何が問題なのですか?明らかに、式全体を解析でき(電卓が機能すると言います)、単一の数値をフォーマットできます(結果をフォーマットできると言います)。

必要なのは、式を解析し、すべての数値をフォーマットして、式を再構成することだけです...

編集:より簡単な解決策があります。フォーマットの場合、式を解析してツリーにする必要はありません。あなたはただ数字を見つける必要があります。

すべての演算子の文字セットを作成することをお勧めします

NSCharacterSet* operators = [NSCharacterSet characterSetWithCharactersInString:@"+*-/^()"];
NSCharacterSet* whitespaces = [NSCharacterSet whitespaceCharacterSet]; 

次に、このセットを使用して式を分割します。

NSString* expression = [...];
NSMutableString* formattedExpression = [NSMutableString string];
NSRange numberRange = NSMakeRange(0, 0);

for (NSUInteger i = 0; i < expression.length; i++) {
   unichar character = [expression characterAtIndex:i];

   if ([whitespaces characterIsMember:character] || [operators characterIsMember:character]) {
        if (numberRange.length > 0) {
            NSString* number = [expression substringWithRange:numberRange];
            NSString* formattedNumber = [self formatNumber:number];
            [formattedExpression appendString:number];

            numberRange.length = 0;
        }
   }
   else if (numberRange.length == 0) {
       numberRange.location = i;
       numberRange.length = 1;
   }
   else {
       numberRange.length++;
   }

   if ([operators characterIsMember:character]) {
       [formattedExpression appendFormat:@"%C", character];
   }
}

if (numberRange.length > 0) {
    NSString* number = [expression substringWithRange:numberRange];
    NSString* formattedNumber = [self formatNumber:number];
    [formattedExpression appendString:number];
}

これは、記号が前に付いた数字に対しても機能するはずであることに注意してください。私はすべての空白を無視しています。なぜなら、きれいな表現が必要な場合は、おそらく空白を別の方法で処理したいからです(たとえば、後のスペースなし(、+/-の前のスペース、後のスペース-数字記号でない場合のみ...)。一般に、スペースを処理する場合、式をツリーに解析すると問題が単純化されます。また、インフィックス式は明確ではないことに注意してください。つまり、括弧を追加する必要がある場合があります。ただし、ツリーに解析しないと実行できません。

于 2013-01-02T19:06:51.777 に答える
1

NSNumberFormatterを検索します。数値のフォーマットを処理するだけでなく、ユーザーのロケールに基づいて処理します。

于 2013-01-02T19:03:50.583 に答える