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 ...
随机推荐
- 洛谷 P2617 Dynamic Ranking
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- 在一个工程中同时使用Swift和Objective-C
Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实 ...
- vector的基本用法
#include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...
- PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20)
PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20) http://www.patest.cn/contests/pat-b-practise/1 ...
- Java InputStream、String、File相互转化
String --> InputStreamByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); Inp ...
- 总结 Swift 中随机数的使用
在我们开发的过程中,时不时地需要产生一些随机数.这里我们总结一下Swift中常用的一些随机数生成函数.这里我们将在Playground中来做些示例演示. 整型随机数 如果我们想要一个整型的随机数,则可 ...
- 【离线做法 树状数组】luoguP1972 [SDOI2009]HH的项链
与bzoj3585: mex的线段树做法有着异曲同工之妙 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 控制mysql数字转换
在实际工作中我们常常需要将数字进行格式化,比如将12.0073233变为12.01,或把12变为12.00,或把12变为0000012,这种格式之间的转换总结如下: 一,浮点数的转换--直接设 ...
- 离线web-ApplicationCache
https://www.html5rocks.com/en/tutorials/appcache/beginner/ http://diveintohtml5.info/offline.html#fa ...
- CVS在update时状态status
cvs update -Ad 时,terminal 会display如下: P xx.v P xx.c ? xx.v ? xx.c A xx.v M xx.v U xx.v C xx.v 第一个字母: ...