登录 立即注册
金钱:

iOS计算器开发框架MathStringExpression

来自: qddnovo 分类: iOS精品源码 上传时间: 2016-8-8 20:02:00

项目介绍:

简介
  • 为需要开发iOS计算器的开发者提供的一个便捷
  • 计算字符串数学表达式
  • 自定义运算符,计算方式
  • 将表达式转JavaScript表达式,让JavaScript引擎实现计算
  • 持续维护
  • 小众需求,谢谢点赞
  • A convenience for developers who need to develop calculators.
  • Mathematical expression for calculating string
  • Custom operators and calculation methods
  • JavaScript expression can be transferred to the JavaScript engine to calculate the expression
  • Star once,ten times a night


如何使用
[Objective-C] 查看源文件 复制代码
//1.将整个文件夹拖入项目
#import "MathStringExpression.h"



计算表达式

[Objective-C] 查看源文件 复制代码
NSNumber* computeResult = [MSParser parserComputeString:@"2(-1*3)+random()" error:nil];



运算符类图



自定义运算符
[Objective-C] 查看源文件 复制代码
//自定义次方算术运算符^,可知优先级与*号相同
MSValueOperator* _pow = [MSValueOperator operatorWithKeyValue:@{@"name":@"^",@"level":@(3)}];
//定义如何计算
[_pow computeWithBlock:^NSNumber *(NSArray *args) {
    return @(pow([args[0] doubleValue], [args[1] doubleValue]));
}];




导入自定义运算符
[Objective-C] 查看源文件 复制代码
MSElementTable* tab = [MSElementTable defaultTable];
[tab setElement:_pow];




定义运算符或常量的表现名
[Objective-C] 查看源文件 复制代码
MSConstant* pi = [[tab elementsFromString:@"PI"] firstObject];//查询元素
pi.showName = @"π";//设置表现名
[tab setElement:pi];//导入表中
//可解析带有π的表达式



重名不同优先级运算符冲突的判定
[Objective-C] 查看源文件 复制代码
//例如项目中已实现了的,解决负号和减号判定的样例
[[MSElementTable defaultTable] handleConflictOperator:@"-"
                  usingBlock:^MSOperator *(NSArray<MSOperator*>* conflictOps,
                                          NSUInteger idx ,
                                          NSArray<MSElement*>* beforeElements,
                                          NSArray<NSString*>* elementStrings) {
  //conflictOps按运算符优先级排列
  if(idx == 0){
       //前一个元素不存在或者是左括号或优先级小于负号的则为负号
       return conflictOps.firstObject;
   }else if ([[beforeElements lastObject] isKindOfClass:[MSPairOperator class]]){
       if([((MSPairOperator*)[beforeElements lastObject]).name isEqualToString:@"("]){
              return conflictOps.firstObject;
       }
   }else if([[beforeElements lastObject] isKindOfClass:[MSValueOperator class]]){
       if(((MSValueOperator*)[beforeElements lastObject]).level >= 2){
          return conflictOps.firstObject;
       }
  }
      return conflictOps.lastObject;
}];



表达式转JavaScript表达式
[Objective-C] 查看源文件 复制代码
NSString* jsExpression = [MSParser parserJSExpressionFromString:@"sin(PI)" error:nil];
//结果为(Math.sin(PI)),可交由JavaScriptCore运算



表达式转JavaScript表达式中的自定义运算符
[Objective-C] 查看源文件 复制代码
//如果JS表达式与当前命名不同则需定义jsTransferOperator对象,无此需求则忽略该步骤。
MSValueOperator* _sqr = [MSValueOperator operatorWithKeyValue:@{@"name":@"√", @"level":@(3)}];
[_sqr computeWithBlock:^NSNumber *(NSArray *args) {
        return @(pow([args[1] doubleValue], 1.0/[args[0] doubleValue]));
}];
[tab setElement:_sqr];
//由于原运算符为算术运算符而js中是函数运算符,所以这里定义一个函数运算符。(不定义该对象默认使用原对象)
MSOperator* sqr_js = [MSOperator operatorWithKeyValue:@{@"name":@"Math.pow",@"level":@(1)}];
_sqr.jsTransferOperator = sqr_js;



转为JavaScript中不存在的表达形式
[Objective-C] 查看源文件 复制代码
//承接上例
//这里自定义如何输出字符串表达式,用于转换到JavaScript表达式
[sqr_js customToExpressionUsingBlock:^NSString *(NSString *name, NSArray<NSString*> *args) {
    //转换为pow(a,1/b)形式
    return [NSString stringWithFormat:@"%@(%@,1/%@)",name,args[0],args[1]];
}];



Mail address quxingyi@outlook.com
  • 一朝做鸟程序员


    DEMO 直接下载(游客可以直接下载)


相关源码推荐:

我来说两句
*滑动验证:
所有评论(24)
qddnovo 2016-8-8 20:05:35
弄错了,管理员怎么删啊
回复
steven1100 2016-8-9 10:54:49
强烈支持楼主ing……
回复
mkjhgfdsa123 2016-8-9 13:19:35
淡定,淡定,淡定……
回复
天猫 2016-8-9 13:29:06
楼主威武啊,Code4App有你更给力!
回复
code4app热心网友 2016-8-10 23:24:27
很给力,Code4App有你更精彩!
回复
code4app热心网友 2016-8-15 22:41:31
感谢分享,Code4App有你更精彩:)
回复
gs2016 2016-8-18 07:48:40
楼主用心了,内容非常精彩。
回复
code4app热心网友 2016-8-21 13:48:14
感谢分享,Code4App有你更精彩:)
回复
code4app热心网友 2016-8-27 09:44:42
学习学习!
回复
123下一页
提取码:  下载次数:33 状态:已购或VIP 售价:0(原价:10)金钱 下载权限:初级码农 
578 0 33
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表