0

我正在尝试制作一个简单的计算器应用程序。目前,该应用程序运行良好。一个问题:将结果更改为格式化数字(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

查找NSNumberFormatter。这不仅会处理数字格式,还会根据用户的语言环境来处理。

于 2013-01-02T19:03:50.583 回答
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 回答