文章目录
- 前言
- I、计算器的核心代码
-
- 1.1 负责计算表达式的工具类
- see also
前言
- 效果图
- 背景
之前使用NSExpression 进行表达式的计算,发现一个问题:无法精准小数点位数(1 65 和65 1 的精度就不一样)
- 解决方案:采用的是NSDecimalNumber 进行计算
NSDecimalNumber
代码语言:javascript复制 NSDecimalNumber* computeResult = [MSParser parserComputeNumberExpression:floatString error:nil];
NSDecimal decimal = computeResult.decimalValue;
NSDecimal desDecimal;
NSDecimalRound(&desDecimal, &decimal , 2, NSRoundPlain);
result = [[NSDecimalNumber decimalNumberWithDecimal:desDecimal] stringValue];
I、计算器的核心代码
代码语言:javascript复制@interface QCTQCTCalculatorViewTableViewCell ()
/**
负责计算表达式的值
*/
@property (strong, nonatomic) CQTMoneyCalculator *moneyCalculator;
/**
计算器视图(读者自己实现,后续考虑开源)
*/
@property (weak, nonatomic) QCTCalculatorView *cellView;
1.1 负责计算表达式的工具类
- moneyCalculator
/**
负责计算表达式的值
*/
@property (strong, nonatomic) CQTMoneyCalculator *moneyCalculator;
- 计算表达式
result = [ self.moneyCalculator kn_evaluateExpression:strArr];
- kn_evaluateExpression
- (NSString *)kn_evaluateExpression:(NSString *)expressionString {
if (expressionString.length<=0) {
return nil;
}
// 处理非法的表达式:最后一个字符是 -/*. 其中的一种就return 去掉;目的是去除运算符
if ([@". -÷/*×x" containsString:[expressionString substringFromIndex:expressionString.length-1]]) {//÷
// 写一个递归计算
NSString *tmp = [expressionString substringToIndex:expressionString.length-1];
// NSString *tmp = [expressionString substr
return [self kn_evaluateExpression: tmp];
}
NSString *sanitizedString = [self sanitizedString:expressionString];
NSString *floatString = [NSString stringWithFormat:@"1.0*%@", sanitizedString];//1.0*1 1 9/8
NSString * result = nil;
NSDecimalNumber* computeResult = [MSParser parserComputeNumberExpression:floatString error:nil];
NSDecimal decimal = computeResult.decimalValue;
NSDecimal desDecimal;
NSDecimalRound(&desDecimal, &decimal , 2, NSRoundPlain);
result = [[NSDecimalNumber decimalNumberWithDecimal:desDecimal] stringValue];
NSLog(@"保留2位小数计算结果为:%@",result);
return result;
}