2010-01-19 5 views
8

J'ai trouvé i petit snipet sur internet, à propos de calculer PMT.Excel PMT fonction dans JS

function PMT(i, n, p) { 
return i * p * Math.pow((1 + i), n)/(1 - Math.pow((1 + i), n)); 
} 
function CalculatePMTFromForm(idLoanAmount, idAnnualInterestRate, idMonths, idResult) { 
var i = jQuery('#' + idAnnualInterestRate).val()/1200; 
var n = jQuery('#' + idMonths).val(); 
var p = jQuery('#' + idLoanAmount).val(); 
var pmt = PMT(i, n, -p); 
jQuery('#' + idResult).val(pmt.toFixed(2)); 
} 
function performCalc() { 
CalculatePMTFromForm('LoanAmount', 'InterestRate', 'Months', 'Payment'); 
} 
jQuery(document).ready(function() { performCalc(); jQuery('.calc').keyup(performCalc); }); 

Lorsque la page est la charge, dans la zone d'entrée de résultat que je vois « nan », et quand je Tpye un nombre non pertinent alors « -Infinity » msg apparaissent. Je recherche "NaN" dans les fichiers et je trouve dans jquery.js, mais après que je modifie, rien ne change. Et je ne peux pas trouver Infinity

Comment puis-je modifier ce message?

Modifier

Indicatif téléphonique: -

function performCalc() { 
    CalculatePMTFromForm('LoanAmount', 'InterestRate', 'Months', 'Payment'); 
} 

jQuery(document).ready(function() { 
    performCalc(); jQuery('.calc').keyup(performCalc); 
}); 

Cela a fonctionné pour moi:

if(pmt>0 && pmt<Number.MAX_VALUE) {jQuery('#' + idResult).val(pmt.toFixed(2));} 
+0

Montrez-nous l'appel à CalculatePMTFromForm? – AnthonyWJones

+0

function performCalc() { CalculatePMTFromForm ('LoanAmount', 'InterestRate', 'Mois', 'Paiement'); } jQuery (document) .ready (fonction() {performCalc(); jQuery ('.calc'). Keyup (performCalc);}); – Holian

+0

Et vous êtes sûr a) que chacun des éléments INPUT en question a l'ID correct (et que cet ID n'est pas dupliqué) et b) chaque INPUT a une valeur initiale fournie par le serveur. – AnthonyWJones

Répondre

0

NaN signifie "Not A Number".

Assurez-vous de vérifier pour chaque valeur d'entrée si elle est numérique. Lancez un message d'erreur si ce n'est pas le cas, ou réglez-le sur 0, selon que c'est essentiel ou non pour votre calcul.

Une bonne collection des meilleures façons de vérifier une valeur pour que ce soit numérique est cette question SO: Validate numbers in JavaScript - IsNumeric()

+0

Je ne comprends pas vraiment. Même si je vérifie la validité des champs d'entrée, l'utilisateur peut écrire un mauvais format, il suffit d'écrire un msg pour taper "number ou smtng" ... Mais jusqu'à ce que l'utilisateur puisse taper le mauvais caractère, alors recevez un message dans le champ de saisie. Je vais vérifier le champ de saisie, mais j'ai besoin de désactiver le message NoN et Infinity. – Holian

0

Essayez comme ceci: -

function CalculatePMTFromForm(idLoanAmount, idAnnualInterestRate, idMonths, idResult) { 
var i = parseFloat($('#' + idAnnualInterestRate).val())/1200; 
var n = parseFloat($('#' + idMonths).val()); 
var p = parseFloat($('#' + idLoanAmount).val()); 
var pmt = PMT(i, n, -p); 
$('#' + idResult).val(pmt.toFixed(2)); 
} 

Le .val() est susceptible renvoyer un type de chaîne pas un type de numéro.

+0

j'ai essayé mais rien n'a changé. – Holian

30

Cette question est morte depuis plus d'un an, mais j'ai récemment dû faire la même chose. Voici ce que je suis venu avec:

function pmt(rate_per_period, number_of_payments, present_value, future_value, type){ 
    if(rate_per_period != 0.0){ 
     // Interest rate exists 
     var q = Math.pow(1 + rate_per_period, number_of_payments); 
     return -(rate_per_period * (future_value + (q * present_value)))/((-1 + q) * (1 + rate_per_period * (type))); 

    } else if(number_of_payments != 0.0){ 
     // No interest rate, but number of payments exists 
     return -(future_value + present_value)/number_of_payments; 
    } 

    return 0; 
} 

type doit être 1 ou 0, même que d'Excel. Le rate_per_period doit être un nombre décimal (par exemple: 0.25, pas 25%).

Un exemple:

/* Example: */ 
var interest = 0.07,  // Annual interest 
    years  = 5,  // Lifetime of loan (in years) 
    present  = 10000, // Present value of loan 
    future  = 20000, // Future value of loan 
    beginning = 1;  // Calculated at start of each period 

var payment = -pmt(interest/12, // Annual interest into months 
        years * 12,  // Total months for life of loan 
        present, 
        future, 
        beginning); 

Et est ~ 474,60 $ le paiement pour la période d'exemple (mois).

Notez la négation du résultat, comme le montant est une déduction - c.-à-d.: Vous coûte 474 $ - le résultat est une valeur négative. Si le résultat était un crédit, le résultat serait positif. Généralement, vous voudrez le garder comme un négatif/positif, mais si vous l'affichez dans un format comme Total Debt: $XYZ, vous voudriez le convertir en positif.

+5

Merci un an plus tard d'un an plus tard :) –

+2

merci, d'une autre année :)! –

+2

Merci encore d'une autre année! –