angular
.module('calculatorApp', [
'ngAnimate',
'ngCookies',
'ngResource',
'ngRoute',
'ngSanitize',
'ngTouch'
])
.controller('MainCtrl', function ($scope) {
$scope.result="";
$scope.data={
"1":["AC","+/-","%","÷"],
"2":["7","8","9","×"],
"3":["4","5","6","-"],
"4":["1","2","3","+"],
"5":["0",".","="]
};
});
*{
margin:0;
padding:0;
}
body {
padding-top: 20px;
padding-bottom: 20px;
}
h1{
text-align:center;
color:#3385ff;
}
.main{
margin:20px auto;
border:1px solid #202020;
border-bottom: none;
width:60%;
height:600px;
}
.result{
display: block;
width: 100%;
height: 30%;
background:#202020;
box-sizing: border-box;
border:none;
padding: 0;
margin: 0;
resize: none;
color: #fff;
font-size: 80px;
text-align: right;
line-height: 270px;
overflow: hidden;
background-clip: border-box;
}
.row{
height: 14%;
background: #d7d8da;
box-sizing: border-box;
border-bottom: 1px solid #202020;
overflow: hidden;
}
.col{
height: 100%;
box-sizing: border-box;
border-right:1px solid #202020;
float: left;
color: #202020;
font-size: 28px;
text-align: center;
line-height: 83px;
}
.normal{
width: 25%;
}
.end-no{
width: 25%;
border-right: none;
background: #f78e11;
color: #fff;
}
.zero{
width: 50%;
}
.history{
background:#3385ff ;
color:#fff;
font-size: 22px;
text-align: center;
}
<body ng-app="calculatorApp" >
<h1>calculator for ios8</h1>
<hr/>
<p class="history">{{ history.join(" ") }}</p>
<div class="main">
<textarea ng-model="result" class="result" ></textarea>
<div ng-repeat="item in data" class="row">
<div class="col" ng-repeat="a in item" ng-class="showClass($index,a)" ng-click="showResult(a)">{{ a }}</div>
</div>
</div>
</body>
//显示计算器样式
$scope.showClass=function(index,a){
if(a==0){
return "zero";
}
return index==3||a=="="?"end-no":"normal";
};
//计算时用的数字的栈 $scope.num=[]; $scope.history=[]; //接受输入用的运算符栈 $scope.opt=[]; //计算器计算结果 $scope.result=""; //表示是否要重新开始显示,为true表示不重新显示,false表示要清空当前输出重新显示数字 $scope.flag=true; //表示当前是否可以再输入运算符,如果可以为true,否则为false $scope.isOpt=true;
$scope.init=function(){
$scope.num=[];
$scope.opt=[];
$scope.history=[];
$scope.flag = true;
$scope.isOpt=true;
} ;
$scope.showResult=function(a){
$scope.history.push(a);
var reg=/\d/ig,regDot=/\./ig,regAbs=/\//ig;
//如果点击的是个数字
if(reg.test(a)) {
//消除冻结
if($scope.isOpt==false){
$scope.isOpt=true;
}
if ($scope.result != 0 && $scope.flag && $scope.result != "error") {
$scope.result += a;
}
else {
$scope.result = a;
$scope.flag = true;
}
}
//如果点击的是AC
else if(a=="AC"){
$scope.result=0;
$scope.init();
}
//如果点击的是个小数点
else if(a=="."){
if($scope.result!=""&&!regDot.test($scope.result)){
$scope.result+=a;
}
}
//如果点击的是个取反操作符
else if(regAbs.test(a)){
if($scope.result>0){
$scope.result="-"+$scope.result;
}
else{
$scope.result=Math.abs($scope.result);
}
}
//如果点击的是个百分号
else if(a=="%"){
$scope.result=$scope.format(Number($scope.result)/100);
}
//格式化result输出
$scope.format=function(num){
var regNum=/.{10,}/ig;
if(regNum.test(num)){
if(/\./.test(num)){
return num.toExponential(3);
}
else{
return num.toExponential();
}
}
else{
return num;
}
}
//如果点击的是个运算符且当前显示结果不为空和error
else if($scope.checkOperator(a)&&$scope.result!=""&&$scope.result!="error"&&$scope.isOpt){
$scope.flag=false;
$scope.num.push($scope.result);
$scope.operation(a);
//点击一次运算符之后需要将再次点击运算符的情况忽略掉
$scope.isOpt=false;
}
//比较当前输入的运算符和运算符栈栈顶运算符的优先级
//如果栈顶运算符优先级小,则将当前运算符进栈,并且不计算,
//否则栈顶运算符出栈,且数字栈连续出栈两个元素,进行计算
//然后将当前运算符进栈。
$scope.operation=function(current){
//如果运算符栈为空,直接将当前运算符入栈
if(!$scope.opt.length){
$scope.opt.push(current);
return;
}
var operator,right,left;
var lastOpt=$scope.opt[$scope.opt.length-1];
//如果当前运算符优先级大于last运算符,仅进栈
if($scope.isPri(current,lastOpt)){
$scope.opt.push(current);
}
else{
operator=$scope.opt.pop();
right=$scope.num.pop();
left=$scope.num.pop();
$scope.calculate(left,operator,right);
$scope.operation(current);
}
};
//负责计算结果函数
$scope.calculate=function(left,operator,right) {
switch (operator) {
case "+":
$scope.result = $scope.format(Number(left) + Number(right));
$scope.num.push($scope.result);
break;
case "-":
$scope.result = $scope.format(Number(left) - Number(right));
$scope.num.push($scope.result);
break;
case "×":
$scope.result = $scope.format(Number(left) * Number(right));
$scope.num.push($scope.result);
break;
case "÷":
if(right==0){
$scope.result="error";
$scope.init();
}
else{
$scope.result = $scope.format(Number(left) / Number(right));
$scope.num.push($scope.result);
}
break;
default:break;
}
};
//判断当前运算符是否优先级高于last,如果是返回true
//否则返回false
$scope.isPri=function(current,last){
if(current==last){
return false;
}
else {
if(current=="×"||current=="÷"){
if(last=="×"||last=="÷"){
return false;
}
else{
return true;
}
}
else{
return false;
}
}
};
//判断当前符号是否是可运算符号
$scope.checkOperator=function(opt){
if(opt=="+"||opt=="-"||opt=="×"||opt=="÷"){
return true;
}
return false;
}
//如果点击的是等于号
else if(a=="="&&$scope.result!=""&&$scope.result!="error"){
$scope.flag=false;
$scope.num.push($scope.result);
while($scope.opt.length!=0){
var operator=$scope.opt.pop();
var right=$scope.num.pop();
var left=$scope.num.pop();
$scope.calculate(left,operator,right);
}
}
};
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有