一个收款计算器算法,从之前高仿有赞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 收款计算器算法的更多相关文章

  1. IOS OC 计算器算法(不考虑优先级)

    个人见解:为还在计算器算法方面迷惑的同学一个数据处理解决方案:定义一个可变数组array,一个可变字符串str,使字符通过[array addObject:str];方法添加到可变数组,每当触发运算符 ...

  2. IOS之计算器实现

    本文利用ios实现计算器app,后期将用mvc结构重构 import UIKit class CalculViewController: UIViewController { @IBOutlet we ...

  3. 微信红包中使用的技术:AA收款+随机算法

    除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...

  4. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  5. 微信iOS收款到账语音提醒开发总结

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ 作者:l ...

  6. iOS面试的算法相关

    转自:https://www.jianshu.com/p/c4820b159159 面试中遇到的这些算法,在平常工作中,基本不会用到. 不过现实的面试中经常喜欢问关于算法的问题 有些还要求写出代码.一 ...

  7. iOS应用九宫格算法

      1.框框横向间隔为:( "界面的总宽度"-"界面每行的控件的宽度" * "每行要现实的列数(这里是3)") / ("列数 + ...

  8. iOS小型计算器

    // //  ViewController.m //  计算器 //屏幕的宽和高 #define SCREEN_W self.view.frame.size.width #define SCREEN_ ...

  9. selenium验证车贷计算器算法

    1.验证页面上的车贷计算器算的结果是否与需求中给的公式结果一致. 页面图片: 代码如下(简单实现,需要优化): package com.test; import java.math.BigDecima ...

随机推荐

  1. 洛谷 P2483 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  2. POJ 2449 Remmarguts' Date

    Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30725   Accepted: 8389 Description &quo ...

  3. XDU——受教了

    存在的问题还是很多的 GG 突然觉得刷题的目的并不是追求A.我们应该在那个过程中提高代码能力和建立模型解题能力 会的算法会巧妙应用才是王道 吐槽自己两句,写高数了

  4. Eclipse 和 MyEclipse 工程描述符

    有时候在一个Java工程里我们需要加入第三方jar包,这时你加入的最好相对路径, 而不是绝对路径.否则你的工程拿到别处就不行运行了.意思就是说你最好把相关的jar放到工程目录下. 对于Web工程来说相 ...

  5. PLSQL练习-数据共享与整合技术

    1.编写一个存储过程,根据输入的工作类型,输出该工作的平均工资. 命令如下: 创建存储过程: create or replace procedure avgsal(v_job in emp.job%t ...

  6. 用cssText批量修改样式

    一般情况下我们用js设置元素对象的样式会使用这样的形式: var element= document.getElementById(“id”);element.style.width=”20px”;e ...

  7. shell脚本自动部署及监控

    一.shell脚本部署nginx反向代理和三个web服务 1 对反向代理服务器进行配置 #!/bin/bash #修改用户交互页面 用户输入参数执行相应的参数 #安装epel扩展包和nginx fun ...

  8. java面试基础篇(二)

    上一篇,我们说了一下线程和Map,或许那些太抽象,不太好理解,也不太方便记忆,我们这次说一些简单的. 1.Q:java的基本数据类型有哪些? A:四种整数类型(byte.short.int.long) ...

  9. var、let、const声明变量的区别

    let和var声明变量的区别:1.let所声明的变量只在let命令所在的代码块内有效.(块级作用域) for(let i=0;i<10;i++){ // ... } console.log(i) ...

  10. Android 使用 adb命令 远程安装apk

    Android 使用 adb命令 远程安装apk ./adb devices 列出所有设备 ./adb connect 192.168.1.89 连接到该设备 ./adb logcat 启动logca ...