一個簡單的稅利計算器(網頁版)

         嗯嗯,作一個簡單的網頁版的稅率計算器,功能比較簡單,可是相對比較實用。由於參考了一些其餘做品,因此在計算匯率的時候習慣性的是以美圓作單位。具體的功能有着較爲詳細的標註。僅供你們學習參考下。php

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>JavaScript Loan Calculator</title>
    <style>
        /*這是一個css樣式列表:定義輸出程序的樣式*/
        .output{  font-weight: bold;  }                /* 計算結果顯示爲粗體*/
        #payment{text-decoration: underline;}         /* 定義id=「payment」的樣式 */
        #graph{border:groove silver 1px;}              /* 設置表格的邊框樣式*/
        th, td{vertical-align: top;}                   /* 表格單元格頂端對齊方式向上對齊*/
        table{ margin:50px auto; border:groove grey 1px;background:rgba(0,0,0,0.2);}

    </style>
</head>
<body>
     <!--這是一個html表格,其中包含<input>元素能夠用來輸入數據
         程序將在<span>元素中顯示計算結果,這些元素都有相似「insert」和「year」的id
         這些id將在表格下面的JavaScript代碼中用到。咱們注意到,有一些
         input元素定義了「onchange」或「onclick」的事件處理程序,以便用戶在輸入數據或或者點擊inputs時
         執行指定的JavaScript代碼段-->
<table>
    <tr><th>輸入貸款數據:</th>
        <td></td><th>Loan Balance,Cumulative Equity, and Insert Payments</th>
    </tr>
        <tr><td>貸款金額($):</td>
        <td><input id="amount" onchange="calculate();"></td>
            <td rowspan="8"><canvas id="graph" width="400" height="250"></canvas></td></tr>
    <tr><td>年利率(%):</td>
        <td><input id="apr" onchange="calculate();"></td></tr>
    <tr><td>償還期限(年):</td>
        <td><input id="years" onchange="calculate();"></td></tr>
    <tr><td>郵政編碼(to find lenders :)</td>
        <td><input id="zipcode" onchange="calculate();"></td></tr>
    <tr><td>近似支付:</td>
        <td><button onclick="calculate();">Calculate</button></td></tr>
    <tr><td>按月支付:</td>
        <td>$<span class="output" id="payment"></span></td></tr>
    <tr><td>總付款:</td>
        <td>$<span class="output" id="total"></span></td></tr>
    <tr><td>總利息:</td>
        <td>$<span class="output" id="totalintersert"></span></td></tr>
    <tr><th>贊助商:</th>
        <td colspan="2">Apply for your loan with one of these fine lenders:
        <div id="lender"></div></td></tr>
</table>

<script>
    function calculate(){
        //經過獲取id查找文檔中用於輸出的元素
        var amount=document.getElementById("amount");
        var apr=document.getElementById("apr");
        var years=document.getElementById("years");
        var zipcode=document.getElementById("zipcode");
        var payment=document.getElementById("payment");
        var total=document.getElementById("total");
        var totalinsert=document.getElementById("totalinsert");

        //假設全部的輸入都是合法的,將從input中獲取輸入的數據
        //將百分比格式轉化爲小數格式,並從年利率轉化爲月利率
        //將年度賠付轉化爲月度賠付
        var principal=parseFloat(amount.value);
        var interest=parseFloat(apr.value)/100/12;
        var payments=parseFloat(years.value)*12;
        
        //如今計算月度賠付額度的數據
        var x=Math.pow(1+interest, payments);   //Math.pow()進行冪次運算
        var monthly=(principal*x*interest);     //  (x-1);

        //若是數字沒有超過JavaScript表示的數字範圍,並且用戶輸入的也正確
        //這裏所展現的結果就是合法的
        if(isFinite(monthly)){
            //將數據填充只輸出字段的位置,四捨五入到小數點後兩位
            payment.innerHTML=monthly.toFixed(2);

            //將用戶的輸入數據保存下來,這樣在下次訪問時也能取到數據
            save(amount.value, apr.value, years.value, zipcode.value);

            //找到並展現本地放貸人,但忽略網絡錯誤
            try{//捕獲這段代碼拋出的異常
              getListener(amount.value, apr.value, years.value , zipcode.value);
            }catch(e){/*忽略這些異常*/}

            //最後,用圖表展現貸款餘額,利息和資產收益、
            chart(principal,interest,monthly,payments);
        }else{
            //計算結果不是數字或者無窮大,意味着輸的的數據是非法的或者是不完整的
            //晴空以前的數據
            payment.innerHTML="";
            total.innerHTML="";
            totalinsert.innerHTML="";            //清空文本內容
            chart();                      //給定空的參數
        }
    }

    //將用戶的輸入保存至localStorage對象的屬性中
    //這些屬性在再次訪問時還會繼續保持在原來的位置
    //若是你在瀏覽器中必學按照file://URL的方式打開本地文件,
    //擇沒法再某些瀏覽器中使用存儲功能(Firefox)
    //經過http打開文件是可行的
    function save(amount,apr,years,zipcode){
        if(window.localStorage){
            //只有在瀏覽器支持的時候才運行這段代碼
            localStorage.loan_amount=amount;
            localStorage.loan_apr=apr;
            localStorage.loan_years=years;
            localStorage.local_zipcode=zipcode;
        }
    }

    //在文字首次加載時將會嘗試還原輸入字段
    window.onload=function(){
        //若是瀏覽器支持本地存儲而且上次保存的值是正確的
        if(window.localStorage && localStorage.loan_amount){
            document.getElementById("amount").value=localStorage.loan_amount;
            document.getElementById("apr").value=localStorage.loan_apr;
            document.getElementById("years").value=localStorage.loan_years;
            document.getElementById("zipcode").value=localStorage.loan_zipcode;
        }
    };

    //將用戶的輸入發送至服務器端腳本(理論上)
    //將返回一個本地放貸人的鏈接列表,在這個例子中並無實現這種查找放貸人的服務
    //但若是該服務存在,改函數會使用它
     function getLenders(amount,apr,years,zipcode){
           //若是瀏覽器不支持XML HTTP Ruquest對象,則退出
         if(!window.XMLHttpRequest)return;

         //找到要顯示放貸人的列表元素
         var ad=document.getElementById("lenders");
         if (!ad)return;                      //若是返回爲空,則退出

         //將用戶輸入的數據進行URL編碼並做爲查詢參數附加在URL裏面
         var url="getLenders.php"+                   //處理數據的URL地址
         "?amt="+encodeURIComponent(amount)+          //使用查詢串中的數據
         "&apr="+encodeURIComponent(apr)+
         "&yrs="+encodeURIComponent(years)+
         "$zip="+encodeURIComponent(zipcode);

         //經過XMLHTTPRuquest對象來提取返回數據
         var req=new XMLHttpRequest();     //發起一個新的請求
         req.open("GET",url);              //經過URL發送一個get請求
         req.send(null);                   //不帶任何正文發送這個請求

         //在返回數據以前,註冊了一個事件處理函數,處理這個函數
         //將會在服務器的響應返回至客戶端的時候調用
         //這種異步編程模型在客戶端JavaScript中是很是常見的
         req.onreadystatechange= function(){
             if(req.status==200 && req.readyState==4){
//代碼運行到這裏,說明咱們獲得了一個完整且合法的HTTP響應
                 var response=req.responseText;  //HTTP響應是以字符串的形式呈現的
                 var lenders=JSON.parse(response);     //將其解析爲js數組
                 //將數組中的放貸人對象轉換爲HTNL字符串形式
                 var list="";
                 for(var i=0; i<lenders.length;i++){
                     list+="<li><a href='"+lenders[i].url+"'>"+lenders[i].name+"</a>";
                 }
                 //將元素在html中呈現出來
                 ad.innerHTML="<ul>"+list+"</ul>";
             }
         }
     }

    //在HTML<canvas>中用圖表展現月度貸款餘額,利息和資產收益
    //若是不傳入參數的話。則清空以前圖表的數據
    function chart(principal,intersert,monthly,payments){
            var graph=document.getElementById("graph");       //獲得<canvas>標籤
        graph.width=graph.width;          //用一種巧妙的手法清除並重佈置畫布

        //若是不傳入參數或者瀏覽器不支持畫布,則直接返回。
        if(argnames.length==0 || !graph.getContext)return;

        //得到畫布元素的「context」對象,這個對象定義了一組繪畫API
        var g=graph.getContent("2d");                 //全部的繪畫操做都講基於這個對象
        var width=graph.width,
                height=graph.height;                  //得到畫布大小

        //這裏的函數做用是將付款數字和美圓數據轉化爲像素
        function paymentTox(n){
            return n*width/payments;
        }
        function amountToy(a){
            return height-(a*height/(monthly*payments*1.05));}

        //付款數據是一條從(0,0)到(payments,monthly*payments)的直線
        g.moveTo(paymentTox(0),amountToy(0));        //從左下方開始
        g.lineTo(paymentTox(payments),amountToy(monthly*payments));        //繪至右上方
        g.lineTo(paymentTox(payments),amountToy(0));                     //再到右下方
        g.closePath();                                                   //將結尾鏈接到開頭
        g.fillStyle="#f88";           //亮紅色
        g.fill();              //填充矩陣
        g.font="bold 12px sans-serif";            //定義一種字體
        g.fillText("Total Inerest Pyanments",20,20) ;                 //將文字繪製到圖例中


        //不少資產數據並非線性的,很那將其反應至圖表中
        var equity= 0;
        g.beginPath();
        g.moveTo(paymentTox(0),amountToy(0));
        for(var p=1; p<=payments; p++){
            //計算出每一筆賠付的利息
            var thisMnothsInterest=(principal-equity)*intersert;
            equity +=(monthly -thisMonthsInsterest);     //獲得資產額
            g.lineTo(paymentTox(p),amountToy(equity));    //將數據繪製到畫布上
        }
        g.lineTo(paymentTox(payments),amountToy(0));            //將數據繪製至X軸
        g.closePath();
        g.fillStyle="green";
        g.fill();
        g.fillText("Total Equity",20,35);                    //文本顏色設置爲綠色

        //再次循環,餘額數據顯示爲黑色粗線條
        var bal=principal;
        g.beginPath();
        g.moveTo(paymentTox(0),amountToy(bal));
        for(var p=1; p<=payments;p++){
            var thisMonthsInterset =ball*interest;
            bal-=(monthly-thisMonthsInterset);    //獲得資產額
            g.lineTo(paymentTox(p),amountToy(bal));     //將直線鏈接至某點
        }
        g.lineWidth=3;        //線條加寬加粗
        g.stroke();           //繪製餘額的曲線
        g.fillStyle="black";
        g.fillText("Loan Balance",20,50);            //圖例文字

        //將年度數據在X軸作標記
        g.textAlign="center";
        var y=amountToy(0);
        for(var year=1; year*12<=payments;year++){
            var x=paymentTox(year*12);
            g.fillRect(x-0.5,y-3,1,3);
            if(year==1)g.fillText("Year",x,y-5);
            if(year%5==0&&year*12!==payments){
                g.fillText(String(year),x,y-5);
            }
            //將賠付數額標記在右邊界
            g.textAlign="right";
            g.textBaseline="middle";
            var ticks=[monthly*payments, principal];
            for(var i=0; i<ticks.length;i++){
                var y=amountToy(ticks[i]);
                g.fillRect(rightEde-3,y-0.5,3,1);
                g.fillText(String(ticks[i].toFixed(0)),rightEdge-5,y);
            }
        }
    }
</script>
</body>
</html>

           這個計算器樣式較爲簡單,實用方便。對於這個計算器的樣式本人偷懶並無進行美化,有心的能夠自行在style裏面添加全部你所須要的樣式。css

            這個計算器的難點在於JavaScript中引用了很多算法,若是閱讀起來有些困難,請先從基本的數學計算開始看起。html

相關文章
相關標籤/搜索