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 ...
随机推荐
- Windows64+Python27下配置matplotlib
注:转载请注明原作者并附上原文链接! 网上看了很多方法,均遇到这样或者那样的问题导致安装失败,最后自己摸索一条方法,最终安装成功了. 1,首先安装numpy,这个可以选择install安装包,很简单, ...
- SQL Server2005的数据还原与备份具体步骤
一:备份数据库步骤 1. 第一步:在开始—>程序(P)—>MicrosoftSQLserver2005—>SQLServerManagementStudio(如下图) 2. 第二步: ...
- 推荐一个markdown格式转html格式的开源JavaScript库
这个markdown格式转html格式的开源JavaScript库在github上的地址: https://github.com/millerblack/markdown-js 从markdown 格 ...
- 优先队列的使用——Expedition
一.题目描述 你需要驾驶一辆卡车行驶L单位距离.最开始时,卡车上有P单位的汽油.卡车每开1单位距离需要消耗1单位的汽油.如果在途中车上的汽油耗尽,卡车就无法继续前行,因而无法到达终点.中途共有N个加油 ...
- 基于KMeans的指数择时策略
[导语]:聚类分析是指将物理或者抽象对象的结合分组为由类似对象组成的多个类的分析过程.简单来讲,聚类就是通过一些特征去自动识别一个大群体中的多个子群体,这些子群体中的对象彼此之间相似度高,而子群体之间 ...
- spring-security中的csrf防御机制(跨域请求伪造)
什么是csrf? csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点.CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社 ...
- 计算机应用第七次作业 html制作个人音乐播放站点
计算机应用第七次作业 html制作个人音乐播放站点 请访问下边网址查看具体操作: http://www.cnblogs.com/qingyundian/p/7878892.html
- makeObjectsPerformSelector用法
亲测 makeObjectsPerformSelector 的用法. - (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAI ...
- Ubuntu 下的aegisub安装
大家用开源的软件用习惯了.推荐大家使用一下字幕编辑软件 分享的是Ubuntu下的安装教程: $ sudo add-apt-repository ppa:djcj/aegisub $ sudo apt- ...
- LeetCode(112) Path Sum
题目 Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...