一个收款计算器算法

一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面Demo在这里
这里贴一下俩个计算的核心方法,具体输入的逻辑判断看Demo

功能需求

  • 显示计算记录
  • 不能连续输入俩个计算符号
  • 小数点的位数不能超过俩位
  • 单个小数点的时候不能输入 00
  • 点击 + ,直接显示计算结果,正则匹配计算
  • 设置最大显示金额
  • 只能出现一个小点,避免类似12.34.2的输入

    源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-(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];
}
-(void)setLabelColor
{
NSMutableAttributedString *str= [[NSMutableAttributedString alloc]initWithString:moneyLabel.text];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0,5)];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- (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];
}