5

5+3*5-3 のような算術式を評価するために次のコードを使用しているカスタム計算機を既に実装しています。

- (NSNumber *)evaluateArithmeticStringExpression:(NSString *)expression {

    NSNumber *calculatedResult = nil;

    @try {
        NSPredicate * parsed = [NSPredicate predicateWithFormat:[expression stringByAppendingString:@" = 0"]];
        NSExpression * left = [(NSComparisonPredicate *)parsed leftExpression];
        calculatedResult = [left expressionValueWithObject:nil context:nil];
    }
    @catch (NSException *exception) {

        NSLog(@"Input is not an expression...!");
    }
    @finally {

        return calculatedResult;
    }
}

しかし、除算演算で整数を使用している場合、結果として整数のみが得られます。5/2 の場合、結果として 2 を取得しているとしましょう。整数除算のため、プログラミングの揺れにぴったりです。

しかし、浮動小数点の結果が必要です。

式文字列をスキャンして整数除数を浮動小数点として置き換えるのではなく、どうすれば取得できますか。この例では、5/2.0 または 5.0/2 です。

4

1 に答える 1

9

私は自分でそれを見つけました。

- (NSNumber *)evaluateArithmeticStringExpression:(NSString *)expression {

    NSNumber *calculatedResult = nil;

    @try {
        NSPredicate * parsed = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"1.0 * %@ = 0", expression]];
        NSExpression * left = [(NSComparisonPredicate *)parsed leftExpression];
        calculatedResult = [left expressionValueWithObject:nil context:nil];
    }
    @catch (NSException *exception) {

        NSLog(@"Input is not an expression...!");
    }
    @finally {

        return calculatedResult;
    }
}

オペランド「1.0 *」で式を開始するだけで、すべてが浮動小数点計算になります。

NSPredicate * parsed = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"1.0 * %@ = 0", expression]];

NB: @Martin R に感謝しますが、私の質問は整数除算に関するものではなく、完全に NSExpression に関するものです。私は最後の文で明らかに除外しました。

@Zaph、ここでは強い理由から例外処理が使用されています。これは、私のメソッドがユーザー入力を受け入れる場所であり、ユーザーは w*g のようなものを入力できます - expressionValueWithObject: context: 例外がスローされ、アプリの異常終了を回避する必要があります。ユーザーが有効な式を入力した場合、ユーザーは NSNumber の形式で回答を取得します。それ以外の場合は、nil NSNumber オブジェクトです。

于 2014-05-28T12:46:08.447 に答える