Resource http://www.meta-calculator.com/l
<!-- first link to jquery --> <!DOCTYPE html> <html> <head> <script src= "http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"> </script><!-- add a little style to the calculator--> <style> input{ font-size:13px; font-weight:bold; padding:5px; margin:5px; } #scientificCalc11 { font-size: 13px; margin: 0; color: #666; text-shadow: 1px 1px 2px #ffffff; font-weight:bold; font-family: "MuseoSans500Regular", sans-serif; } #scientificCalc11 cell{ width:20%; font-weight:bold } #scientificCalc11 #results{ width:250px; background-color:#CCC; height:20px; margin:5px; padding:3px; } .calcbttn { border: 0px; cursor:pointer; font-family: "MuseoSans500Regular", sans-serif; text-shadow: 1px 1px 2px #ffffff; color: #666; padding-left: 8px; padding-right: 8px; font-size: 13px; background-repeat: no-repeat; background: #eee; background: -webkit-linear-gradient(#fff, #eee); background: -moz-linear-gradient(top, #fff, #eee); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee'); -moz-box-shadow: 0px 1px 3px 0px #bcbcbc, inset 0 0 3px #ffffff; -webkit-box-shadow: 0px 1px 3px 0px #bcbcbc, inset 0 0 3px #ffffff; box-shadow: 0px 1px 3px 0px #bcbcbc, inset 0 0 3px #ffffff; } #errmsg{ display:none; background-color:#F9F; color:#900; border-width:2px; border-style:solid; border-color:#900; font-weight:bold; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } </style><!-- the main script follows: --> <script> $(window).ready(function(){ var debug = false; var input = $("#calc_tb"); var $posfix = $("#posfix"); var $answer = $("#answer"); var bFirstTime = true; var $results = $("#results"); var bWasNumeric =false; var bisNumeric = false; var $rb =$("#radians_rb"); // if(debug)$results.html('1 +sin(30) + cos(60) + 2.1') var functions = [ 'sqrt' , 'cos' , 'sin' , 'log10', 'ln' ,'abs' ,'tan' ] function isOperand(elem, bAllowParenthesis){ elem = $.trim( elem) ; if(bAllowParenthesis && ( elem == '(' || elem == ')' ) ) return true; return (elem == '+' || elem == '-' || elem == '*' || elem =='/' || elem == '^' ); } function displayError(msg, data) { var h ='' if(msg =='mismatched_parenthesis') h = ' Your paranthesis are not balanced'; else if(msg == 'too_many_decimals') h = ('You entered a number with too many decimals'); else if(msg == 'number_parse_problem') h = ('We had trouble understanding the following term ' + data); else if(msg == 'rpn_pop_pop') h = ('We we were unable to process your expression') //This postifix syntax is invalid'); else if (msg == 'division_by_zero' ) h = (' You are trying to divide by zero!' ); else if (msg =='could_not_parse') h = ('We we were unable to process your expression'); $("#errmsg").css('display','block'); $("#errmsg").html( h ) } function getFullNumber(str){ var bFoundDot = false; var out=""; for( var j = 0 ;j< str.length ; j++) { var currLett = str.substring(j, j + 1 ) ; if( '0123456789'.indexOf(currLett) != -1 ) out += currLett; else if( '.' == currLett && bFoundDot) { displayError('too_many_decimals'); break; } else if( '.' == currLett && bFoundDot== false) { out += currLett ; bFoundDot = true; } else break; } return out; } function toArr(data){ var bAllowParenthesis = true; var arr =[]; for(var i = 0;i< data.length; i++) { var currLett = data.substring(i, i+1); if(currLett== ' ') continue; //is a dot or is a digit var bisNumeric = currLett == '.' || '0123456789'.indexOf(currLett) != -1 ; if(bisNumeric ) {//get the full number which could be several characters long var fullNum = getFullNumber(data.substring(i ) ) var isOk = isNaN( +fullNum) == false; //one last check that it actually is a number if(isOk ) arr.push( parseFloat( fullNum) +"") ; else displayError('number_parse_problem', fullNum); i += fullNum.length-1; // -1 because i is i++ in loop } else if( isOperand( currLett, bAllowParenthesis) ) arr.push(currLett); } //there's got be a better way to do this..but it works ;) //support unary negative signs by finding them and putting them with numbers they preceed for( i = arr.length-1 ;i >= 0 ; i--) { var token = arr[i]; //look for negatives if( arr[i] == '-' ) { if( i ==0 && arr.length > 0) { arr[0] = '-' + arr[1]; arr.splice(1,1); } //negative preceded by an operand and is a unary else if ( i+ 1< data.length && i > 0 && isOperand(arr[i-1] , bAllowParenthesis ) && '0123456789.'.indexOf(arr[i+1] )) { arr[i] = '-'+ arr[i+1] ; arr.splice(i+1,1); } } } return arr } function resetErr(){ $("#errmsg").css('display','none') } input.focus(function(){ if(bFirstTime) input.val('') input.css('color','black'); bFirstTime = false; }) function p( str){if (debug) console.log(str ) ; } function infixToPostfix(array){ var i, operandStack = []; var output=[] ; var bAllowParenthesis = true; for( i = 0 ; i < array.length; i++) { var currentToken = $.trim( array[i] ); if( isOperand( currentToken, bAllowParenthesis )) { p("I is operand " + currentToken + ', output : ' +output + ", operandStack: " +operandStack); if( operandStack.length == 0 ) operandStack.push( currentToken ); else if ( operandStack.length > 0 && currentToken == ')' ) { while (operandStack.length > 0 && operandStack[operandStack.length-1] != '(' ) { output. push( operandStack.pop()); } p('\t B now, pop off ' +operandStack[operandStack.length-1] + ' SHOULD BE CLOSING PARENTHESIS!' ); if(operandStack[operandStack.length-1] != '(') { displayError('mismatched_parenthesis'); return; } operandStack.pop() ; // remove parenthesis }// else if( operandStack.length > 0 ) { p("II is operand " + currentToken + ', output : ' +output); if( (operandStack[operandStack.length-1] == "(" && currentToken == "(" || ( currentToken != "(" ) && operatorToPrecedence(operandStack[operandStack.length-1]) >= operatorToPrecedence( currentToken) ) ) { p(" C , operandStack : "+operandStack ); while (operandStack.length > 0 && operandStack[operandStack.length-1] != "(" && operatorToPrecedence(operandStack[operandStack.length-1]) >= operatorToPrecedence( currentToken) ) { output.push( operandStack.pop() ); } p('\t D now, pop off ' +operandStack[operandStack.length-1] ); operandStack.push(currentToken) ; } else if ( operatorToPrecedence( operandStack[operandStack.length-1] ) < operatorToPrecedence( currentToken) ) { p('\t III operandStack[operandStack.length-1] ,' +operandStack[operandStack.length-1] + "< " + currentToken ); operandStack.push( currentToken ); } } } // ELSE IT IS ANUMBER else if ( isNaN( +currentToken) == false) // ie it is a number { p("IV isNumber() currentToken = " +currentToken); output.push(currentToken) } } while( operandStack.length > 0 ) output.push( operandStack.pop() ) ; return output; } function operatorToPrecedence( op){ if( op == "+" || op == "-" ) return 1; else if( op== "*" || op == '/') return 2; else if (op == '^') return 3; else if (op == '(' || op == ')') return 4; else throw ("Unknown operator =" +op + ',at operatorToPrecedence()') } ///this does not actually us a stack because the user has entered teh entire equation // function evaluateRPN( rpnArray ) { var operandsStack = []; var r = 0; var i =0; var iterationCount = 0; while (rpnArray.length > 1) { var currentToken = $.trim(rpnArray[i]) ; if( isOperand( currentToken )) { //console.log(' isOperand() ' + op); var op = rpnArray.splice(i,1); var insertAt = i-2; i--; if(rpnArray.length < 2) { displayError('rpn_pop_pop') return; } var n1Was = rpnArray.splice(i,1); i--; var n2Was = rpnArray.splice(i,1); var n1 =parseFloat(n1Was ); var n2 =parseFloat( n2Was); if( isNaN( +n1)) { console.log('n1 , ' + n1Was + ', is not a number. Parsing exiting now'); displayError('could_not_parse');//invalid_token_rpn', 'Invalid syntax. ' + n1Was + ' should be a number'); return ; } if( isNaN( +n2)) { displayError('could_not_parse'); console.log('n2 , ' + n2Was + ', is not a number. Parsing exiting now '); return ; } var pushMe = calculate( n2, n1, op); rpnArray.splice(insertAt, 0, pushMe ); } else i++; if (iterationCount++ > 500 ) { displayError('could_not_parse'); console.log('get me outta here, there is something wrong'); return; } } if(rpnArray.length != 1) { displayError('could_not_parse'); console.log('unable to parse postfix expression : ' + rpnArray.toString().substring(1, rpnArray.toString().length-1) ); } return rpnArray.pop(); } function calculate (a,b,op){ if( op == '+') return a + b; else if( op == '-') return a - b; else if( op == '*') return a * b; else if( op == '^') return Math.pow(a,b); else if( op == '/') { if(b == 0) { displayError('division_by_zero'); //throw ("division by zero"); return; } return a / b; } } function replaceAllPis(){ var data = new String($results.text()) ; if(data.indexOf('pi') == -1) return; while( data.indexOf('pi') != -1) { var firstPart = data.substring(0,data.indexOf('pi') ); var middle = Math.PI; var lastPart = data.substring( data.indexOf('pi') + 2 )// data = firstPart + middle + lastPart; } $results.html(data) } function evaluateFuncts(){ var finalString=''; var bRadians = $rb.is(":checked"); var radDeg = bRadians? 1 : ( Math.PI/180 ); replaceAllPis(); for(var i = 0 ; i < functions.length ; i++) { var data = new String($results.text()) ; var fxn= functions[i]; var c =0; var firstRun = true ; while(data.indexOf(fxn ) != -1 && c++ < 5) { if(firstRun ) { p('fxn: ' + fxn + ', data : ' +data); firstRun =false; } var inject ='inject' var iStart = data.indexOf(fxn ); var temp = data.substring(iStart + fxn.length ); var iEnd = temp.indexOf( ')' ) +1; var lastPart = temp.substring(iEnd);; temp = temp.substring( 0 ,iEnd); // this is ( 60) for something like cos(60) var number = temp.substring(temp.indexOf('(')+1 , temp.indexOf(')' )); if( isNaN( +number)) console.log('problem parsing number = ' +number); number = parseFloat (number); if(fxn == 'sin') { console.log('radDeg * number ' +(radDeg * number)); inject = Math.sin(radDeg * number); console.log('Math.sin(radDeg * number) Math.sin(' + (radDeg * number) +')= ' +inject ); } else if(fxn == 'cos') inject = Math.cos(radDeg * number); else if(fxn == 'tan') inject = Math.tan(radDeg * number); else if(fxn == 'sqrt') inject = Math.sqrt(number); else if(fxn == 'log10') inject = Math.LOG10E(number); else if(fxn == 'ln') inject = Math.LN10(number); else if(fxn == 'abs') inject = Math.abs(number); var firstPart = data.substring(0,iStart); data = firstPart + ' ' + inject + ' ' + lastPart; $results.text( data ) } } } $(".calcbttn").click(function(){ resetErr(); bisNumeric =false; var val = $(this).val() var inject='' if( $.inArray (val, functions) != -1 ) { inject = ( bWasNumeric ? ' * ' : '' ) + val +'(' } else if( val == 'del') { { var data = new String($results.text()) ; if(data.length == 0 ) return; else if(data.length == 1 && data == ' ') return; var lastLttr = data.substring(data.length-1 ); if(lastLttr == ' ') data = data.substring(0, data.length-2) ; else data = data.substring(0, data.length-1) ; $results.html (data); return; } } else if(val == 'C') { $results.html('') return; } else if (val == 'parenleft') inject = '(' ; else if (val == 'parenright') inject = ')' ; else if(val== '=') { evaluateFuncts(); var arr = toArr($results.text()); arr = infixToPostfix(arr) ; var theResult= evaluateRPN(arr); $results .html (theResult); return; } else if( val == 'pi') { inject = 'pi' bisNumeric = true; } else { if( isNaN(+val ) == false || val == '.') bisNumeric = true; inject = val; } // console.log( $(this).val() + ' was clicked '); var space = (bWasNumeric && bisNumeric ) ? '' : ' '; $results .html ( $results.html() + space + inject ); bWasNumeric = bisNumeric; }) $("#clear").click(function(){ input.val(''); }) }) </script><!-- now the html part --> <title></title> </head> <body> <div id="scientificCalc11"> <div id="errmsg"></div> <div id="results"></div> <table style="width:250px;"> <tr> <td class="cell"><input class='calcbttn' id="7" type="button" value="7"></td> <td class="cell"><input class='calcbttn' id="8" type="button" value="8"></td> <td class="cell"><input class='calcbttn' id="9" type="button" value="9"></td> <td class="cell"><input class='calcbttn' id="divide" type= "button" value="/"></td> <td class="cell"><input class='calcbttn' id="parenleft" type= "button" value="("></td> </tr> <tr> <td class="cell"><input class='calcbttn' id="4" type="button" value="4"></td> <td class="cell"><input class='calcbttn' id="5" type="button" value="5"></td> <td class="cell"><input class='calcbttn' id="6" type="button" value="6"></td> <td class="cell"><input class='calcbttn' id="multiply" type= "button" value="*"></td> <td class="cell"><input class='calcbttn' id="parenright" type= "button" value=")"></td> </tr> <tr> <td class="cell"><input class='calcbttn' id="1" type="button" value="1"></td> <td class="cell"><input class='calcbttn' id="2" type="button" value="2"></td> <td class="cell"><input class='calcbttn' id="3" type="button" value="3"></td> <td class="cell"><input class='calcbttn' id="plus" type= "button" value="+"></td> <td class="cell"><input class='calcbttn' id="clear" type= "button" value="C"></td> </tr> <tr> <td class="cell"><input class='calcbttn' id="0" type="button" value="0"></td> <td class="cell"><input class='calcbttn' id="decimal" type= "button" value="."></td> <td class="cell"><input class='calcbttn' id="minus" type= "button" value="-"></td> <td class="cell"><input class='calcbttn' id="^" type="button" value="^"></td> <td class="cell"><input class='calcbttn' id="evaluate" type= "button" value="="></td> </tr> <tr> <td class="cell"><input class='calcbttn' id="abs" type="button" value="abs"></td> <td class="cell"><input class='calcbttn' id="sin" type="button" value="sin"></td> <td class="cell"><input class='calcbttn' id="cos" type="button" value="cos"></td> <td class="cell"><input class='calcbttn' id="tan" type="button" value="tan"></td> <td class="cell"><input class='calcbttn' id="del" type="button" value="del"></td> </tr> <tr> <td class="cell"><input class='calcbttn' id="log10" type= "button" value="log10"></td> <td class="cell"><input class='calcbttn' id="log2" type= "button" value="log2"></td> <td class="cell"><input class='calcbttn' id="ln" type="button" value="ln"></td> <td class="cell"><input class='calcbttn' id="pi" type="button" value="pi"></td> <td class="cell"><input class='calcbttn' id="sqrt" type= "button" value="sqrt"></td> </tr> </table><input id="radians_rb" name="raddeg" type="radio" value= "radians"> Radians <input checked id="degrees_rb" name="raddeg" type= "radio" value="degrees"> degrees </div> <!-- REMOVING THE TEXT BELOW VIOLATES THE TOS OF USING THIS SCRIPT --> <span style="font-size:12px; font-style:italic;">brought to you by www.meta-calculator.com</span> </body> </html>
Go back to home page