iOS 收款计算器算法
一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面
demo 在这里 https://github.com/L-vinCent/calculView_function
- 显示计算记录
- 不能连续输入俩个计算符号
- 小数点的位数不能超过俩位
- 单个小数点的时候不能输入 00
- 点击 + ,直接显示计算结果,正则匹配计算
- 设置最大显示金额
- (IBAction)calculate:(UIButton *)sender { UIButton *btn=(UIButton *)sender; NSArray *firstArr=@[@"",@"+",@".",@"←",@""]; //首字母输入要忽略的字符 NSArray *LastArr=@[@"+",@"."]; //不同连续输入的字符 NSArray *zeroArr=@[@"+",@"←"]; // 在.00之后可以点击的字符 if (historyStr.length>=) {
//x.00 之后不能再输入数字
NSString *dot=[historyStr substringWithRange:NSMakeRange(historyStr.length-, )]; if ([dot isEqualToString:@"."]&&![zeroArr containsObject:btn.titleLabel.text]&&![[historyStr substringWithRange:NSMakeRange(historyStr.length-, )] isEqualToString:@"+"]) { return;
} NSLog(@"------%@",dot);
} if (historyStr.length>=) {
NSString *dot=[historyStr substringWithRange:NSMakeRange(historyStr.length-, )];
if ([dot isEqualToString:@"."]&&[btn.titleLabel.text isEqualToString:@""]) {
return;
} } if (historyStr.length==) {
//首字符
if([firstArr containsObject:btn.titleLabel.text]){
return;
} }else{ if ([LastArr containsObject:[historyStr substringFromIndex:historyStr.length-]]) { if ([LastArr containsObject:btn.titleLabel.text]) { return;
} } } if ([btn.titleLabel.text isEqualToString:@"收款"]) {
//处理收款按钮事件
if (self.block) { self.block(_calculatePanel.text.floatValue); }
return; } //处理清除按钮事件
if ([btn.titleLabel.text isEqualToString:@"←"]) { if (historyStr.length>) { //清除原来的数字,重新输入
NSRange deleteRange = { [historyStr length] - , };
[historyStr deleteCharactersInRange:deleteRange]; _historyLabel.text=historyStr; NSString *result=[self calculatePattern:[self scanPattern:historyStr]]; _calculatePanel.text=[NSString stringWithFormat:@"%.2f",[result floatValue]];
moneyLabel.text=[NSString stringWithFormat:@"应收金额: ¥%.2f",[result floatValue]]; if (historyStr.length==) {
_historyLabel.text =@"";
} }else
{
//在为0的时候继续按清除键 _historyLabel.text =@"";
_calculatePanel.text=@"0.00";
moneyLabel.text=kNorMoneyLabelStr; } return;
} if (_calculatePanel.text.floatValue>=) {
_calculatePanel.text=@"300000.00";
moneyLabel.text=@"应收金额: 300000.00";
_historyLabel.text=@"";
historyStr=@"".mutableCopy;
[PPHUDHelp showMessage:@"最高金额不能超过30w"];
return;
} // NSString *moneyStr=[NSString stringWithFormat:@"%.2f",sender.titleLabel.text.floatValue]; [historyStr appendString:sender.titleLabel.text];
_historyLabel.text=[historyStr copy]; NSString *result=[self calculatePattern:[self scanPattern:historyStr]]; _calculatePanel.text=[NSString stringWithFormat:@"%.2f",[result floatValue]];
moneyLabel.text=[NSString stringWithFormat:@"应收金额: ¥%.2f",[result floatValue]]; }
-(NSArray *)scanPattern:(NSString *)pattern {
NSUInteger header = ;
NSMutableString *middleData = [NSMutableString stringWithFormat:@""];
NSMutableArray *middleArray = [NSMutableArray array]; for (; header < pattern.length; header++) {
unichar letter = [pattern characterAtIndex:header];
// NSLog(@"%d", letter);
if ((letter >= && letter <= ) || letter == ) {
char ch = (char)letter;
[middleData appendFormat:@"%c", ch];
}else {
if ([middleData length] <= ) {
_error = YES;
break;
}
[middleArray addObject:[middleData copy]];
char ch = (char)letter;
NSString *character = [NSString stringWithFormat:@"%c", ch]; BOOL isHighLevel = (ch == '/' || ch == '*' || ch == '%'); if([_operators count] == ) {
[_operators addObject:character];
} else if(isHighLevel && ([[_operators lastObject] isEqualToString:@"+"] || [[_operators lastObject] isEqualToString:@"-"])) {
[_operators addObject:character];
}else {
[middleData appendString:[_operators lastObject]];
[middleArray addObject:[_operators lastObject]];
[_operators removeLastObject];
[_operators addObject:character];
}
NSRange range = NSMakeRange(, [middleData length]);
[middleData deleteCharactersInRange:range];
}
}
[middleArray addObject:[middleData copy]]; while ([_operators count]) {
[middleArray addObject:[_operators lastObject]];
[_operators removeLastObject];
}
return [middleArray copy];
}
- (NSString *)calculatePattern:(NSArray *)pattern { // Stack<Double> intStack = new Stack<Double>();
NSMutableArray *intStack = [NSMutableArray array];
double result=; for (int i = ; i < [pattern count]; i++) {
NSString *letter = pattern[i];
// NSLog(@"%@", letter);
NSString *string = [letter stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]]; if (string.length == || [string containsString:@"."]) {
NSNumber *number = [NSNumber numberWithDouble:[letter doubleValue]];
[intStack addObject:number];
} else {
NSNumber *topNum = [intStack lastObject];
[intStack removeLastObject]; NSNumber *secondNum = [intStack lastObject];
[intStack removeLastObject]; double top = [topNum doubleValue];
double second = [secondNum doubleValue]; switch([pattern[i] characterAtIndex:])
{
case '*':
result = top * second;
break;
case '/':
result = second / top;
break;
case '+':
result = top + second;
break;
case '-':
result = second - top;
break;
}
[intStack addObject:[NSNumber numberWithDouble:result]];
}
}
NSNumber *finalResult = [intStack lastObject];
[intStack removeLastObject]; return [NSString stringWithFormat:@"%@", finalResult];
}
iOS 收款计算器算法的更多相关文章
- IOS OC 计算器算法(不考虑优先级)
个人见解:为还在计算器算法方面迷惑的同学一个数据处理解决方案:定义一个可变数组array,一个可变字符串str,使字符通过[array addObject:str];方法添加到可变数组,每当触发运算符 ...
- IOS之计算器实现
本文利用ios实现计算器app,后期将用mvc结构重构 import UIKit class CalculViewController: UIViewController { @IBOutlet we ...
- 微信红包中使用的技术:AA收款+随机算法
除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...
- Python开发——利用正则表达式实现计算器算法
Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...
- 微信iOS收款到账语音提醒开发总结
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ 作者:l ...
- iOS面试的算法相关
转自:https://www.jianshu.com/p/c4820b159159 面试中遇到的这些算法,在平常工作中,基本不会用到. 不过现实的面试中经常喜欢问关于算法的问题 有些还要求写出代码.一 ...
- iOS应用九宫格算法
1.框框横向间隔为:( "界面的总宽度"-"界面每行的控件的宽度" * "每行要现实的列数(这里是3)") / ("列数 + ...
- iOS小型计算器
// // ViewController.m // 计算器 //屏幕的宽和高 #define SCREEN_W self.view.frame.size.width #define SCREEN_ ...
- selenium验证车贷计算器算法
1.验证页面上的车贷计算器算的结果是否与需求中给的公式结果一致. 页面图片: 代码如下(简单实现,需要优化): package com.test; import java.math.BigDecima ...
随机推荐
- 洛谷 P1204 [USACO1.2]挤牛奶Milking Cows
题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...
- Linux系统里让vim支持markdown格式的语法高亮
Markdown是深受程序员喜爱的一个文件格式. 然而Linux里默认的vim设置,并不支持markdown格式的语法高亮显示. 下面就来介绍如何设置使得markdown格式的文件在vim里也能享有语 ...
- Java使用HtmlUnit抓取js渲染页面
需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...
- UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)
恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...
- 树形dp——覆盖所有边的最少费用(Protecting Zonk)
一.问题描述 有一个n(n<=10000)个节点的无根树.有两种装置A,B,每种都有无限多个. 1.在某个节点X使用A装置需要C1(C1<=1000)的花费,并且此时与节点X相连的边都被覆 ...
- vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决
vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决
- dinner 后台 nodemon 部署 Koa (关闭everything 安装或排除node_modules) # mysql 没开192.168.x.x 需要设置一下 #Navicat Premium,mysql 数据库版本有要求:mysql-5.7.17.msi 对??的支持
tip1:新建数据库 记得选 字符集和排序规则 utf8 -- UTF-8 Unicode utf8_general_ci 后台链接部分 1. 全局管理员安装 nodemon,后台热部署(右键 管理员 ...
- 漫谈 Clustering (4): Spectral Clustering<转载>
转自http://blog.pluskid.org/?p=287 如果说 K-means 和 GMM 这些聚类的方法是古代流行的算法的话,那么这次要讲的 Spectral Clustering 就可以 ...
- ZOJ-1360 || POJ-1328——Radar Installation
ZOJ地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=360 POJ地址:http://poj.org/problem?id ...
- selenium-介绍和安装
前戏 相信大家对web自动化selenium都不陌生,是一个web自动化框架,我在第一家公司的时候,产品是两个星期一个版本,每一次发布测试都要进行回归测试,也就是大家说的点点点,后来我就想,能不能做成 ...