Objective C - 检查NSString是否可计算

时间:2014-11-01 01:44:41

标签: ios objective-c error-handling nsstring nsexception

我使用Objective C在Xcode中编写计算器进行学习(我是初学者)。这尤其是我正在使用的代码(用于计算NSString)。

- (IBAction)resultButtonPressed:(id)sender {

NSExpression *expression = [NSExpression expressionWithFormat:label_result.text];

label_result.text = [NSString stringWithFormat:@"%@", [expression expressionValueWithObject:nil context:nil]];

}

问题在于,每当用户输入“不可计算的”内容时,喜欢' 6(5 + 1)'而不是' 6 *(5 + 1)',程序崩溃了,我得到了这个:

2014-11-01 02:36:10.577 The Calculator[1515:575020] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "6(5+1) == 1"'
*** First throw call stack:
(0x18672de48 0x196e280e4 0x18753ad98 0x187538e2c 0x18764b128 0x18764b0c4 0x100062244 0x18af110f8 0x18aefa22c 0x18af10a94 0x18af10720 0x18af09c74 0x18aedd38c 0x18b17c1b4 0x18aedb8f4 0x1866e60e8 0x1866e538c 0x1866e343c 0x1866111f4 0x18f7a75a4 0x18af42784 0x10006286c 0x197496a08)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

所以在过去的半小时里我一直在搜索一个方法/函数,它允许你首先检查 NSString是否可以计算,这样我就可以(如果需要)创建一个警告标签或类似的东西,但我找不到。有没有人可以帮助我?

谢谢!

3 个答案:

答案 0 :(得分:5)

NSExpression并非旨在成为错误检测,用户可更正的表达式解析器。开发人员可以使用它来评估确保正确形成的表达式。也没有内置API来实现这一目标。

您必须在其他地方查找具有用户友好错误处理的表达式解析器。鉴于表达式解析是一个典型的Comp Sci 101问题,谷歌搜索“C数学表达式解析器”或“iOS数学表达式解析器”或任何其他几十个关键字汤组合将产生代码和讨论。

注意:不要打扰异常捕获路径。 iOS / OS X中的例外仅用于表示程序员错误,并且不能被设计为可恢复。

答案 1 :(得分:2)

试试吧!

@try {
NSExpression *expression = [NSExpression expressionWithFormat:label_result.text];
label_result.text = [NSString stringWithFormat:@"%@", [expression expressionValueWithObject:nil context:nil]];
} @catch (NSException *exception) {
if ([[exception name] isEqualToString:NSInvalidArgumentException]) {
label_result.text = @"Invalid Expression";
}

注意:在Cocoa中不推荐尝试/捕获异常。异常应该用于意外错误。 您也可以使用像这样的数学解析器https://github.com/davedelong/DDMathParser。 抱歉我的英语,我是法国人。

答案 2 :(得分:0)

如果您想使用它,我的计算器中有一个方法可以完成您想要实现的目标。

https://github.com/iMillJoe/Calc7.2.1

请参阅IMCalculatorBrain(和IMShunting Token),计算器采用NSString表达式,并返回带有数字或语法错误的NSString。语法围绕TI图形计算器设计。