さて、何が問題なのですか?明らかに、式全体を解析でき(電卓が機能すると言います)、単一の数値をフォーマットできます(結果をフォーマットできると言います)。
必要なのは、式を解析し、すべての数値をフォーマットして、式を再構成することだけです...
編集:より簡単な解決策があります。フォーマットの場合、式を解析してツリーにする必要はありません。あなたはただ数字を見つける必要があります。
すべての演算子の文字セットを作成することをお勧めします
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];
}
これは、記号が前に付いた数字に対しても機能するはずであることに注意してください。私はすべての空白を無視しています。なぜなら、きれいな表現が必要な場合は、おそらく空白を別の方法で処理したいからです(たとえば、後のスペースなし(、+/-の前のスペース、後のスペース-数字記号でない場合のみ...)。一般に、スペースを処理する場合、式をツリーに解析すると問題が単純化されます。また、インフィックス式は明確ではないことに注意してください。つまり、括弧を追加する必要がある場合があります。ただし、ツリーに解析しないと実行できません。