CalculatorViewController.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. #import "CalculatorViewController.h"
  2. @interface CalculatorViewController ()
  3. @end
  4. @implementation CalculatorViewController
  5. @synthesize pwd;
  6. #define BUTTON
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. // Do any additional setup after loading the view, typically from a nib.
  10. self.view.backgroundColor=[UIColor blackColor];
  11. CGFloat mWidth=self.view.frame.size.width;
  12. CGFloat mHieght=self.view.frame.size.height;
  13. //加载button
  14. [self loadButtons:mWidth Hight:mHieght];
  15. //加载textField
  16. [self loadTextField:mWidth Hight:mHieght];
  17. //初始化Calculator
  18. _cl=[[Calculator alloc]init];
  19. }
  20. #pragma mark ----样式设置----
  21. -(void)loadButtons:(CGFloat)mWidth Hight:(CGFloat)mHieght{
  22. CGFloat x=1;
  23. CGFloat y=mHieght-(((mWidth-5)/4)*5)-1 - 60;
  24. NSArray *buttonArray=@[@"C",@"+/-",@"%",@"÷",@"7",@"8",@"9",@"×",@"4",@"5",@"6",@"—",@"1",@"2",@"3",@"+",@"0",@".",@"="];
  25. NSInteger buttonArrayID=0;
  26. for (int i=0; i<5; i++) {
  27. for (int j=0; j<(i==4?3:4); j++) {
  28. UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
  29. button.frame=CGRectMake(x, y, (buttonArrayID==16?(mWidth-5)/4*2+1 - 13:(mWidth-5)/4 - 13), (mWidth-5)/4 - 13);
  30. button.layer.cornerRadius = ((mWidth-5)/4 - 13)/2;
  31. [button setTitle:[buttonArray objectAtIndex:buttonArrayID] forState:UIControlStateNormal];
  32. button.titleLabel.font=[UIFont systemFontOfSize:40];
  33. button.tag=100+buttonArrayID;
  34. [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  35. if (buttonArrayID%4==3||buttonArrayID==[buttonArray count]-1) {
  36. button.backgroundColor=HWEFA23BColor;
  37. }else if(buttonArrayID==16){
  38. //设置 0 Button 文字向右对齐
  39. [button setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, (mWidth-5)/4)];
  40. x+=((mWidth-5)/4)+1;
  41. button.backgroundColor=HW333333Color9;
  42. }else if(buttonArrayID<3){
  43. button.backgroundColor=HWA5A5A5Color;
  44. [button setTitleColor: [UIColor blackColor] forState:UIControlStateNormal] ;
  45. }else{
  46. button.backgroundColor=HW333333Color9;
  47. }
  48. [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
  49. [self.view addSubview:button];
  50. x+=((mWidth-5)/4)+1;
  51. buttonArrayID++;
  52. }
  53. x=1;
  54. y+=((mWidth-5)/4)+1;
  55. }
  56. }
  57. -(void)loadTextField:(CGFloat)mWidth Hight:(CGFloat)mHieght{
  58. _TF=[[UITextField alloc]initWithFrame:CGRectMake(10, 50, mWidth-20, mHieght-(((mWidth-5)/4)*5)-50)];
  59. _TF.tag=1000;
  60. _TF.textColor=[UIColor whiteColor];
  61. [_TF setEnabled:NO];
  62. _TF.textAlignment=NSTextAlignmentRight;
  63. _TF.adjustsFontSizeToFitWidth=YES;//自适应宽度
  64. _TF.text=@"0";
  65. _TF.font=[UIFont fontWithName:@"HelveticaNeue-Thin" size:80];
  66. [self.view addSubview:_TF];
  67. }
  68. #pragma mark ----button响应----
  69. //button响应方法
  70. -(void)buttonAction:(UIButton *)sender{
  71. [self removeTextFieldFormat];
  72. switch (sender.tag) {
  73. case 100:
  74. //清除
  75. if ([sender.titleLabel.text isEqualToString:@"AC"]) {
  76. [self buttonSymbolStyleReduction:sender];
  77. }
  78. self.TF.text=@"0";
  79. [sender setTitle:@"AC" forState:UIControlStateNormal];
  80. [self.cl calculatorEmpty];
  81. break;
  82. case 101:
  83. //正负转换
  84. [self getPlusMinus:self.TF.text];
  85. break;
  86. case 102:
  87. //百分比
  88. [self getPercentage:self.TF.text];
  89. break;
  90. case 103:
  91. //除
  92. [self execute];
  93. self.cl.exType=1;
  94. [self buttonSymbolStyleReduction:sender];
  95. [self buttonSymbolStyle:sender];
  96. break;
  97. case 107:
  98. //乘
  99. [self execute];
  100. self.cl.exType=2;
  101. [self buttonSymbolStyleReduction:sender];
  102. [self buttonSymbolStyle:sender];
  103. break;
  104. case 111:
  105. //减
  106. [self execute];
  107. self.cl.exType=3;
  108. [self buttonSymbolStyleReduction:sender];
  109. [self buttonSymbolStyle:sender];
  110. break;
  111. case 115:
  112. //加
  113. [self execute];
  114. self.cl.exType=4;
  115. [self buttonSymbolStyleReduction:sender];
  116. [self buttonSymbolStyle:sender];
  117. break;
  118. case 117:
  119. //小数点
  120. [self decimalPoint:self.TF Button:sender];
  121. break;
  122. case 118:
  123. //等
  124. [self execute];
  125. self.cl.exType=0;
  126. [self buttonSymbolStyleReduction:sender];
  127. // self.TF.text=@"0";
  128. break;
  129. default:
  130. //判断清空计数
  131. if (self.emptyCount!=0) {
  132. self.TF.text=@"";
  133. self.emptyCount=0;
  134. }
  135. [self buttonSymbolStyleReduction:sender];
  136. [(UIButton *)[self.view viewWithTag:100] setTitle:@"C" forState:UIControlStateNormal];
  137. [self textFieldValueChange:self.TF Button:sender];
  138. break;
  139. }
  140. [self addTextFieldFormat];
  141. }
  142. #pragma mark ----样式处理----
  143. //添加点击运算符号button样式方法
  144. -(void)buttonSymbolStyle:(UIButton *)sender{
  145. [sender.layer setBorderWidth:2];
  146. }
  147. //还原运算符号button样式方法
  148. -(void)buttonSymbolStyleReduction:(UIButton *)sender{
  149. [((UIButton *)[self.view viewWithTag:103]).layer setBorderWidth:0] ;
  150. [((UIButton *)[self.view viewWithTag:107]).layer setBorderWidth:0] ;
  151. [((UIButton *)[self.view viewWithTag:111]).layer setBorderWidth:0] ;
  152. [((UIButton *)[self.view viewWithTag:115]).layer setBorderWidth:0] ;
  153. [sender.layer setBorderWidth:0];
  154. }
  155. //添加textfield格式
  156. -(void)addTextFieldFormat{
  157. NSMutableString *mutableStr=[NSMutableString stringWithString:self.TF.text];
  158. NSInteger mutableStrLength=mutableStr.length;
  159. //判断是否包含小数点 如果包含获取小数点左边的数字个数mutableStrLength
  160. if ([mutableStr containsString:@"."]) {
  161. mutableStrLength=[self getPointLeft:mutableStr];
  162. }else{
  163. mutableStrLength=[self getNumberCount:mutableStr];
  164. }
  165. for(int i=3 ; i<mutableStrLength ; i++ ){
  166. //每三个数字添加一次分隔符
  167. if (i%3==0) {
  168. //添加分隔逗号
  169. if (mutableStrLength>i) {
  170. NSInteger index=mutableStr.length-i-(mutableStr.length-mutableStrLength);
  171. NSRange range=NSMakeRange(index-1, 1);
  172. //如果上一个不是负号则添加分隔逗号
  173. if (![[mutableStr substringWithRange:range]isEqualToString:@"-"]) {
  174. //如果第一个是负号 分隔符位置+1
  175. if ([[mutableStr substringWithRange:NSMakeRange(0, 1)]isEqualToString:@"-"]) {
  176. [mutableStr insertString:@"," atIndex:index+1];
  177. }else{
  178. [mutableStr insertString:@"," atIndex:index];
  179. }
  180. }else{
  181. [mutableStr insertString:@"," atIndex:index+1];
  182. }
  183. }
  184. }
  185. }
  186. //如果textfield为空时 自动补0
  187. if ([mutableStr isEqualToString:@""]) {
  188. mutableStr=[NSMutableString stringWithString:@"0"];
  189. }
  190. self.TF.text=mutableStr;
  191. }
  192. //去除textfield格式
  193. -(void)removeTextFieldFormat{
  194. if ([self.TF.text isEqualToString:@"0"]) {
  195. self.TF.text=@"";
  196. }
  197. self.TF.text=[self.TF.text stringByReplacingOccurrencesOfString:@"," withString:@""];
  198. }
  199. //textField内容处理方法 限制输入长度 添加分隔符
  200. -(void)textFieldValueChange:(UITextField *)tf Button:(UIButton *)sender{
  201. NSString *buttonTitleStr=sender.titleLabel.text;
  202. if ([self getNumberCount:tf.text]<9) {
  203. tf.text=[tf.text stringByAppendingString:buttonTitleStr];
  204. }
  205. NSLog(@"tf.text = %@",tf.text);
  206. if ([tf.text isEqualToString:pwd]){
  207. [self.view removeFromSuperview];
  208. }
  209. }
  210. //小数点限制方法
  211. -(void)decimalPoint:(UITextField *)tf Button:(UIButton *)sender{
  212. //判断是否已经输入小数点
  213. if (![tf.text containsString:@"."]) {
  214. tf.text=[tf.text stringByAppendingString:sender.titleLabel.text];
  215. }
  216. //判断是否直接输入小数点
  217. if([self.TF.text isEqualToString:@"."]){
  218. self.TF.text=@"0.";
  219. }
  220. }
  221. //获取小数点左边数字个数
  222. -(NSInteger)getPointLeft:(NSString *)str{
  223. NSInteger pointLeft=str.length;
  224. //判断是否包含小数点 如果包含获取小数点左边的数字个数
  225. if ([str containsString:@"."]) {
  226. NSRange range = [str rangeOfString:@"."];
  227. NSLog(@"getPointLeft=%ld",range.location);
  228. pointLeft=range.location;
  229. }
  230. //判断是否包含负号
  231. if ([str containsString:@"-"]) {
  232. pointLeft-=1;
  233. }
  234. return pointLeft;
  235. }
  236. //获取小数点右边数字个数
  237. -(NSInteger)getPointRight:(NSString *)str{
  238. NSInteger pointRight=0;
  239. //判断是否包含小数点 如果包含获取小数点右边的数字个数
  240. if ([str containsString:@"."]) {
  241. NSRange range = [str rangeOfString:@"."];
  242. NSLog(@"getPointRight=%ld",str.length- range.location);
  243. pointRight=str.length- range.location;
  244. }
  245. return pointRight;
  246. }
  247. //获取纯数字个数
  248. -(NSInteger)getNumberCount:(NSString *)str{
  249. NSInteger numberCount=str.length;
  250. //判断是否包含小数点
  251. if ([str containsString:@"."]) {
  252. numberCount-=1;
  253. }
  254. //判断是否包含负号
  255. if ([str containsString:@"-"]) {
  256. numberCount-=1;
  257. }
  258. //判断是否包含分隔逗号
  259. if ([str containsString:@","]) {
  260. if ([self getPointLeft:str]<5) {
  261. numberCount-=1;
  262. }else{
  263. numberCount-=2;
  264. }
  265. }
  266. return numberCount;
  267. }
  268. //UIColor 转UIImage
  269. - (UIImage*) createImageWithColor: (UIColor*) color{
  270. CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  271. UIGraphicsBeginImageContext(rect.size);
  272. CGContextRef context = UIGraphicsGetCurrentContext();
  273. CGContextSetFillColorWithColor(context, [color CGColor]);
  274. CGContextFillRect(context, rect);
  275. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  276. UIGraphicsEndImageContext();
  277. return theImage;
  278. }
  279. - (void)didReceiveMemoryWarning {
  280. [super didReceiveMemoryWarning];
  281. // Dispose of any resources that can be recreated.
  282. }
  283. #pragma mark ----运算----
  284. //正负数转换
  285. -(void)getPlusMinus:(NSString *)number{
  286. self.TF.text=[self.cl getPlusMinus:self.TF.text];
  287. [self textFieldLastValue];
  288. }
  289. //ios计算器bug
  290. //2 * 9 ÷ 目前等于18 转换正负数会变为-0
  291. //计算百分比
  292. -(void)getPercentage:(NSString *)number{
  293. number=[NSString stringWithFormat:@"%f",[number doubleValue]/100];
  294. //去除floa转换后后面多余的0
  295. self.TF.text = [NSString stringFloatHandle:number];
  296. [self textFieldLastValue];
  297. }
  298. //ios计算器bug
  299. //5 * 点击% 变成0.05 再点6 等于30 而不是0.3
  300. //判断textfield上的内容是否为上一次的运算结果 并进行赋值操作 以保证连续运算时执行以上两种操作后的结果能够正确参与运算
  301. -(void)textFieldLastValue{
  302. //如果number1和result都不为空 number2为空 并且清空计数为1(说明刚刚点击过运算符号button) 说明当前textfield上的内容为上一次的运算结果
  303. if (self.cl.number1 != nil) {
  304. if (self.cl.result != nil) {
  305. if (self.cl.number2==nil) {
  306. if (self.emptyCount==1) {
  307. self.cl.number1=self.TF.text;//将转换后的值赋给number1,以便下次运算使用
  308. }
  309. }
  310. }
  311. }
  312. }
  313. //四则运算
  314. -(void)execute{
  315. if(self.emptyCount==0){
  316. if(self.cl.number1 ==nil){
  317. self.cl.number1=self.TF.text;
  318. }else{
  319. self.cl.number2=self.TF.text;
  320. }
  321. //如果number1和number2都不为空 进行计算
  322. if (self.cl.number2 != nil && self.cl.number1 != nil) {
  323. //判断除数是否为0
  324. if([self.cl.number2 isEqualToString:@""]&&self.cl.exType==1){
  325. self.TF.text=@"错误";
  326. }else{
  327. self.TF.text=[self.cl Execute];
  328. }
  329. }
  330. //清空计数
  331. self.emptyCount=1;
  332. }
  333. }
  334. @end