嗯,有什么问题?你显然可以解析整个表达式(你说计算器有效),你可以格式化单个数字(你说你可以格式化结果)。
您唯一需要做的就是解析表达式,格式化所有数字并重新组合表达式......
编辑:有一个更简单的解决方案。对于格式化,您不需要将表达式解析为树。你只需要找到数字。
我建议创建所有运算符的字符集
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];
}
请注意,即使对于以符号为前缀的数字,这也应该有效。我忽略了所有的空格,因为如果你想要一个漂亮的表达式,你可能想要以不同的方式处理空格(例如,在 (、+/- 之前的空格、之后的空格 - 仅当它不是数字符号时...)。通常,对于处理空格,将表达式解析为树会简化问题。还要注意,中缀表达式不是明确的 - 这意味着您有时应该添加括号。但是,如果不解析为树,就无法做到这一点。