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 ...
随机推荐
- php 正则符号说明
preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array); preg_match_all (&qu ...
- Nodejs + Jshint自动化静态代码检查
1. 目的 提交代码前能够自动化静态代码检查,提高代码质量 2. 准备 1. Nodejs安装: 官方地址:http://nodejs.org/ 安装说明:根据电脑配置下载对应的版本进行 ...
- (八)maven学习之继承
继承 如果项目划分了多个模块,都需要依赖相似的jar包,只需要创建一个父模块,在它的pom.xml文件中配置依赖的jar包.功能模块只需要继承父模块,就可以自动得到其依赖的jar包,而不需要再每个模块 ...
- spark简单入门
本文由cmd markdown编辑,原始链接:https://www.zybuluo.com/jewes/note/35032 RDD是什么? RDD是Spark中的抽象数据结构类型,任何数据在Spa ...
- Ace 在HTML中使用方法
<!DOCTYPE html> <html> <head> <title>Demo of ACE Editor</title> <!- ...
- java 去掉html/style/css等标签
//定义script的正则表达式 private static String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/sc ...
- BestCoder Round#15 1002-Instruction
http://acm.hdu.edu.cn/showproblem.php?pid=5083 官方题解——> 1002 Instruction 先考虑编码,首先找到operation对应的编码, ...
- SNP|RELP|genetic polymorphism|
5.3个体基因组呈现广泛变化 遗传多态性:一个基因座上存在多个等位基因(因为野生型不止一种基因)的现象,但是只有这多种等位基因满足:1.多个基因稳定存在2.基因在种群中数目大于1%时,认为该基因座多态 ...
- poi导出word模板项目实例(一个文件)
在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面 <table class="formTa ...
- noip_最后一遍_3-数据结构
noip基础数据结构太多了又太捞了 所以也就那么几个了 单调队列滑动窗口 #include<bits/stdc++.h> using namespace std; #define maxn ...