Cocoa touch 解析需要格式化的长数字的算术表达式

Cocoa touch 解析需要格式化的长数字的算术表达式,cocoa-touch,expression,number-formatting,Cocoa Touch,Expression,Number Formatting,我正在尝试制作一个简单的计算器应用程序。目前,该应用程序运行良好。一个问题是:将结果转换成格式化的数字(800000=800000)足够聪明,但不能转换成完整的表达式(200*600/21000=200*600/21000) 我希望能够有一个方法,我可以提供一个字符串,并返回一个正确格式的数字字符串,操作仍然在字符串中 例如: 我用30000/80^2的方法输入数据。方法返回30000/80^2 编辑:人们似乎误解了这个问题(或者我可能误解了答案!)我希望能够将数字分开-60000/200000

我正在尝试制作一个简单的计算器应用程序。目前,该应用程序运行良好。一个问题是:将结果转换成格式化的数字(800000=800000)足够聪明,但不能转换成完整的表达式(200*600/21000=200*600/21000)

我希望能够有一个方法,我可以提供一个字符串,并返回一个正确格式的数字字符串,操作仍然在字符串中

例如:

我用30000/80^2的方法输入数据。方法返回30000/80^2


编辑:人们似乎误解了这个问题(或者我可能误解了答案!)我希望能够将数字分开-60000/200000将分为60000和200000。我可以从那里开始做。

向上看。它不仅可以处理数字的格式设置,还可以根据用户的语言环境进行设置。

那么,问题出在哪里?显然,您可以解析整个表达式(您说计算器工作),您可以格式化单个数字(您说您可以格式化结果)

您只需要解析表达式,格式化所有数字,然后重新组合表达式

编辑:有一个更简单的解决方案。对于格式化,不需要将表达式解析到树中。你只要找到号码就行了

我建议创建所有操作符的字符集

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];
}

NSString*表达式=[…];
NSMutableString*formattedExpression=[NSMutableString];
NSRange numberRange=NSMakeRange(0,0);
for(整数i=0;i0){
NSString*number=[表达式substringWithRange:numberRange];
NSString*formattedNumber=[自格式化编号:编号];
[formattedExpression appendString:number];
numberRange.length=0;
}
}
else if(numberRange.length==0){
numberRange.location=i;
numberRange.length=1;
}
否则{
numberRange.length++;
}
if([成员:字符]){
[formattedExpression appendFormat:@“%C”,字符];
}
}
如果(numberRange.length>0){
NSString*number=[表达式substringWithRange:numberRange];
NSString*formattedNumber=[自格式化编号:编号];
[formattedExpression appendString:number];
}

请注意,即使是带有符号前缀的数字,这也应该有效。我忽略了所有的空格,因为如果你想有一个漂亮的表达式,你可能希望以不同的方式处理空格(例如,(,空格前+/-,空格后-如果不是数字符号…)。一般来说,对于处理空格,将表达式解析到树中会简化问题。还要注意中缀表达式不是明确的-这意味着您有时应该添加括号。但是,如果不解析到树中,这是无法完成的。

该方法是否只取一个字符串并返回另一个字符串?如果是,它是否应该执行以下操作解析本身?@NikolaiRuhe不完全正确。我基本上只是想要一种能够将表达式拆分为数字和运算的方法,正如编辑后的问题所述。很抱歉,您不喜欢我的编辑;我正试图澄清您的问题,以便潜在的回答者能够更好地理解它。(注:)我尊重你的作者身份,但我还是会再次请求你或我,并建议你添加一些格式,澄清一些措辞,以便于阅读。祝你好运。(谢谢你保留正确的标签。)你必须定义什么是数字:整数?浮点数?在哪种语言环境下?带分隔符或符号字符?科学符号?你绝对应该使用与计算相同的解析器。是的,这就是我对结果所做的。实际上,我使用GCMathParser进行解析,所以解析对我来说是不透明的。我想我只是想要一种方法来解析分离数字-请参见编辑原始问题。实际上,我使用GCMathParser进行解析,因此解析对我来说是不透明的。我想我只是想找到一种方法来分离数字-请参见编辑原始问题。@ErwaySoftware:您可能必须找到另一个解析器,一个允许您“点击”的解析器。这是一个选项(我从未使用过它)。写这篇文章的戴夫·德隆(Dave DeLong)就在这里。@ErwaySoftware:谢谢,但这更多的是一个提示而不是一个答案。请允许我建议您自己写一篇文章,并为未来的读者提供一些细节(DDMathParser的哪一部分允许您做您需要的事情,即。)当你有几分钟的时间。添加了简单的表达式格式化代码,但我建议使用一个解析器,它可以让你处理表达式树。事情会变得简单得多。