iOS 收款计算器算法

一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面

demo 在这里 https://github.com/L-vinCent/calculView_function

  • 显示计算记录
  • 不能连续输入俩个计算符号
  • 小数点的位数不能超过俩位
  • 单个小数点的时候不能输入 00
  • 点击 + ,直接显示计算结果,正则匹配计算
  • 设置最大显示金额
- (IBAction)calculate:(UIButton *)sender {

    UIButton *btn=(UIButton *)sender;

    NSArray *[email protected][@"00",@"+",@".",@"←",@"0"];  //首字母输入要忽略的字符

    NSArray *[email protected][@"+",@"."];  //不同连续输入的字符

    NSArray *[email protected][@"+",@"←"];  // 在.00之后可以点击的字符

    if (historyStr.length>=3) {
     //x.00 之后不能再输入数字
        NSString *dot=[historyStr substringWithRange:NSMakeRange(historyStr.length-3, 1)];

        if ([dot isEqualToString:@"."]&&![zeroArr containsObject:btn.titleLabel.text]&&![[historyStr substringWithRange:NSMakeRange(historyStr.length-1, 1)] isEqualToString:@"+"]) {

            return;
        }

        NSLog(@"------%@",dot);
    }

    if (historyStr.length>=2) {
        NSString *dot=[historyStr substringWithRange:NSMakeRange(historyStr.length-2, 1)];
        if ([dot isEqualToString:@"."]&&[btn.titleLabel.text isEqualToString:@"00"]) {
            return;
        }

    }

    if (historyStr.length==0) {
        //首字符
        if([firstArr containsObject:btn.titleLabel.text]){
            return;
        }

    }else{

        if ([LastArr containsObject:[historyStr substringFromIndex:historyStr.length-1]]) {

            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>0) {

        //清除原来的数字,重新输入
            NSRange deleteRange = { [historyStr length] - 1, 1 };
            [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==0) {
                _historyLabel.text =@"";
            }

        }else
        {
        //在为0的时候继续按清除键

            _historyLabel.text =@"";
            _calculatePanel.text=@"0.00";
            moneyLabel.text=kNorMoneyLabelStr;

        }

        return;
    }

    if (_calculatePanel.text.floatValue>=300000) {
        _calculatePanel.text=@"300000.00";
        moneyLabel.text=@"应收金额: 300000.00";
         _historyLabel.text=@"300000";
        historyStr=@"300000".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 = 0;
    NSMutableString *middleData = [NSMutableString stringWithFormat:@""];
    NSMutableArray *middleArray = [NSMutableArray array];

    for (; header < pattern.length; header++) {
        unichar letter = [pattern characterAtIndex:header];
//        NSLog(@"%d", letter);
        if ((letter >= 48 && letter <= 57) || letter == 46) {
            char ch = (char)letter;
            [middleData appendFormat:@"%c", ch];
        }else {
            if ([middleData length] <= 0) {
                _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] == 0) {
                [_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(0, [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=0;

    for (int i = 0; i < [pattern count]; i++) {
        NSString *letter = pattern[i];
//        NSLog(@"%@", letter);
        NSString *string = [letter stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];

        if (string.length == 0 || [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:0])
            {
                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];
}
 
时间: 2024-10-13 21:51:59

iOS 收款计算器算法的相关文章

JAVA计算器算法实现

import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class BorderJFrame extends JFr

iOS小型计算器

// //  ViewController.m //  计算器 //屏幕的宽和高 #define SCREEN_W self.view.frame.size.width #define SCREEN_H self.view.frame.size.height #import "ViewController.h" @interface ViewController () //用于存储输入的第一个数字 @property (nonatomic,assign) CGFloat num1; /

iOS之计算器

// //  zyAppDelegate.h //  Calculator // //  Created by nimami on 15/7/20. //  Copyright (c) 2015年 zhiyou. All rights reserved. // #import <UIKit/UIKit.h> @interface zyAppDelegate : UIResponder <UIApplicationDelegate> { int a,b,c; NSString * a

自己做的一种计算器算法的设计..不知道代码是否有bug

1 package Test; 2 import java.util.Scanner; 3 /** 4 * 设计一个计算器,实现多行输入,并分别输出结果 5 * 输入: 6 * 4/2+5+9*7-9 7 * 3*2+8/2-7+2 8 * 3+8*4-5+3+1 9 * 9/4/2+7-6-1 10 * 输出: 11 * 61 12 * 5 13 * 34 14 * @author litaiqing 15 * 16 */ 17 public class Test { 18 public st

iOS汉字识别改进算法

简介 前边一篇文章介绍了班讯通中新加的一个根据拼音写汉字功能的第一版本算法实现,今天说一说改进之后的算法. 在班讯通3.2版本提交之后,我们对汉字识别算法进行了改进,并且将该模块抽离出来完善成了一个新的应用--写霸,现已经通过appstore审核上线, 欢迎大家下载体验. 进入正题 在第一版本中,我们将整个字拆为若干笔画存入数据库,每条笔画记录都对应若干条点记录,模板和用户记录均如此,在对比模板和用户数据的时候,根据笔画id对比相应的记录,最后根据匹配结果计算分数.新的版本里,我们在数据库中为所

iOS应用九宫格算法

1.框框横向间隔为:( "界面的总宽度"-"界面每行的控件的宽度" * "每行要现实的列数(这里是3)") / ("列数 + 1") 2.框框纵向间隔可以自定义写死 3.每个框框横向摆放的位置是:(框框宽度+间隔宽度)乘以(列号) 4.每个框框纵向摆放的位置为:(框框高度+间隔宽度)乘以(行号) + 顶端间隔[这里是30] 5.每个框框在第几行第几列的算法为: 行号为"框框的序号对列数取商", 列号为&qu

selenium验证车贷计算器算法

1.验证页面上的车贷计算器算的结果是否与需求中给的公式结果一致. 页面图片: 代码如下(简单实现,需要优化): package com.test; import java.math.BigDecimal; import org.junit.Assert; import org.openqa.selenium.By; import org.testng.Reporter; import org.testng.annotations.AfterClass; import org.testng.ann

iOS 单链表算法的一些问题

链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 相比于线性表顺序结构,操作复杂.由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn

java栈实现简易计算器算法

问题描述: 对于任意字符串,包含+ - * /和括号, 求出该表达式的值 首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如: -1+(-2)*3       遇到负号怎么办? 现贴出代码如下: 1 package calcultor; 2 3 import java.util.Stack; 4 5 public class Calcultor { 6 7 static boolean isNumber(char x) { 8 if (x >= '0' &&