2010-01-19 16 views
8

Encontré un pequeño snipet en internet, sobre el cálculo de PMT.Función Excel PMT en 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); }); 

Cuando la página se carga, en el cuadro de entrada consecuencia veo "NaN", y cuando me tpye un número irrelevante luego "-Infinity" msg aparece. Busco "NaN" en archivos y lo encontré en jquery.js, pero después de modificarlo, nada cambia. Y no puedo encontrar Infinity

¿Cómo puedo cambiar este mensaje?

Editar

Código de llamada: -

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

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

Esto se trabajó para mí:

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

Muestranos la llamada a CalculatePMTFromForm? – AnthonyWJones

+0

function performCalc() { CalculatePMTFromForm ('LoanAmount', 'InterestRate', 'Months', 'Payment'); } jQuery (documento) .ready (function() {performCalc(); jQuery ('. Calc'). Keyup (performCalc);}); – Holian

+0

Y está seguro de que a) cada elemento de ENTRADA en cuestión tiene la ID correcta (y esa ID no está duplicada) y b) cada ENTRADA tiene un valor inicial proporcionado por el servidor. – AnthonyWJones

Respuesta

0

NaN significa "no es un número".

Asegúrese de verificar cada valor de entrada, ya sea numérico. Lanza un mensaje de error si no lo está, o ajústelo a 0, dependiendo de si es esencial para tu cálculo o no.

Una buena colección de las mejores maneras de comprobar un valor para ya sea numérico es esta cuestión de forma: Validate numbers in JavaScript - IsNumeric()

+0

realmente no entiendo. Incluso si compruebo la validez de los campos de entrada, el usuario puede escribir un formato incorrecto, simplemente obtenga un mensaje para escribir "number o smtng" ... Pero hasta que el usuario pueda encontrar el caracter incorrecto, entonces reciba un mensaje en el campo de entrada de resultados NaN. Revisaré el campo de entrada, pero necesito cambiar el mensaje NoN e Infinito de alguna manera. – Holian

0

Trate de esta manera: -

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)); 
} 

El .val() es probable devolver un tipo de cadena, no un tipo de número.

+0

intenté pero nada cambió. – Holian

30

Esta pregunta ha estado muerta durante más de un año, pero recientemente tuve que hacer lo mismo. Esto es lo que ocurrió:

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 es necesario que haya 1 o 0, igual que Excel de. El rate_per_period debe ser un decimal (por ejemplo: 0.25, no 25%).

Un ejemplo:

/* 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); 

y el pago por el periodo ejemplo (mes) es ~ $ 474,60.

Tenga en cuenta la negación del resultado, ya que la cantidad es una definición, es decir, le cuesta $ 474, el resultado es un valor negativo. Si el resultado fuera un crédito, el resultado sería positivo. En general, querrá mantenerlo como negativo/positivo, pero si lo estuviera mostrando en un formato como Total Debt: $XYZ, querría convertirlo a positivo.

+5

Gracias un año después de un año después :) –

+2

gracias, de otro año :)! –

+2

¡Gracias de un año más! –

Cuestiones relacionadas