#javascript #jquery #html #jquery-calculation
#javascript #jquery #HTML #jquery-вычисление
Вопрос:
У меня есть приложение для вычислений, которое я создаю, и оно у меня есть, где на входе отображаются запятые, и вычисление все еще может выполняться, несмотря на запятые, но теперь я не могу получить вывод для отображения с разделителями в тысячу запятых. Я перепробовал почти все, что мог придумать. Может кто-нибудь показать мне, где я могу быть выключен.
Вот мой скрипт:
jQuery( document ).ready( function( $ ) {
// SHOW OUTPUT DIV ONLY WHEN ALL FIELDS ARE COMPLETED
$( '#calc-top' ).bind( 'keyup change', function() {
var orderAmount = $( '#orderAmt' ).val().replace( '', ',' );
if ( orderAmount !== "" amp;amp; $( "#duration option:selected" ).val() !== "" amp;amp; $( "#debitFreq option:selected" ).val() !== "" ) {
$( 'div#calc-bottom' ).css( 'display', 'block' );
} else {
$( 'div#calc-bottom' ).css( 'display', 'none' );
}
} );
} );
jQuery(document).ready(function($){
$("#orderAmt").keyup(function(event) {
// skip for arrow keys
if (event.which >= 37 amp;amp; event.which <= 40) {
event.preventDefault();
}
var $this = $(this);
var num = $this.val().replace(/,/gi, "");
var num2 = num.split(/(?=(?:[0-9]{3}) $)/).join(",");
console.log(num2);
// the following line has been simplified. Revision history contains original.
$this.val(num2);
});
});
// end jQuery
// CALCULATE USER INPUT AND WRITE OUTPUT TO HTML ELEMENTS
function calculate() {
var orderAmt = parseFloat(document.getElementById( "orderAmt" ).value.replace(/,/g, ''));
var duration = document.getElementById( "duration" ).value || 0;
var debitFreq = document.getElementById( "debitFreq" ).value || 0;
var outputAmt = document.getElementById( 'outputAmt' ) || 0;
var numPayments = document.getElementById( 'numPayments' ) || 0;
// CALCULATE NUMBER OF PAYMENTS
if ( debitFreq == 7 ) {
numPayments = Math.floor( duration / 7 );
} else if ( debitFreq == 30 ) {
numPayments = Math.floor( duration / 30 );
}
document.getElementById( 'numPayments' ).innerHTML = numPayments;
// CALCULATE PAYMENT AMOUNT
var stepA = (orderAmt / numPayments);
var stepB = Math.floor( (((15 / 1000) * (duration / 360)) * 12) * orderAmt ) || 0;
var stepC;
if ( debitFreq == 7 ) {
stepC = 0.10;
//} else if (debitFreq == 30) {
//stepC = 0.05;
} else {
stepC = 0;
}
var stepD = 0;
//if ((duration == 30) amp;amp; (debitFreq == 30)) {
//stepD = 0.05;
//} else {
//stepD = 0;
//}
var stepE = stepC - stepD;
var stepF = Math.floor( (((15 / 1000) * (duration / 360)) * 12) * orderAmt ) || 0;
var stepG = Math.ceil( stepE * stepF );
var stepH = stepB - stepG;
var stepI = stepH / numPayments;
var monthlyPayments = stepI stepA;
outputAmt.innerHTML = monthlyPayments.toFixed( 2 ) || 0;
// OUTPUT WILL SHOW CORRECT DEBIT FORMATS BASED ON USER INPUT (i.e. 'week', 'weeks', 'month', 'months')
var outputDefault1;
if ( document.getElementById( "debitFreq" ).value == 7 ) {
outputDefault1 = "week";
} else if ( document.getElementById( "debitFreq" ).value == 30 ) {
outputDefault1 = "month";
}
document.getElementById( "outputTerm1" ).innerHTML = outputDefault1;
var outputDefault2;
if ( document.getElementById( "debitFreq" ).value == 7 ) {
outputDefault2 = "weeks";
} else if ( document.getElementById( "debitFreq" ).value == 30 ) {
outputDefault2 = "months";
}
document.getElementById( "outputTerm2" ).innerHTML = outputDefault2;
}
// end calculate function
// ONLY ALLOW NUMERIC INPUT, NO ALPHA OR SPECIAL CHARACTERS EXCEPT COMMAS
function isNumberKey( evt ) {
var theEvent = evt || window.event;
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode( key );
var regex = /^[0-9.,] $/;
if ( !regex.test( key ) ) {
theEvent.returnValue = false;
if ( theEvent.preventDefault ) {
theEvent.preventDefault();
}
}
}
// TRIGGER EVENTS WHEN THE USER ENTERS DATA
var userinputNum = document.getElementById( "orderAmt" );
userinputNum.oninput = calculate;
userinputNum.onkeypress = isNumberKey;
var userinputDays = document.getElementById( "duration" );
userinputDays.onchange = calculate;
var userinputFreq = document.getElementById( "debitFreq" );
userinputFreq.onchange = calculate;
Вот моя скрипка: http://jsfiddle.net/qo5b7z93 /
Любая помощь приветствуется!
Комментарии:
1. Вы могли бы использовать numeraljs.com , если вы не хотите этого делать, то разделите свой результат на 1000 и сократите это, а затем умножьте остальное на 1000. что-то вроде Math.trunc(значение / 1000) ‘,’ (значение % 1000).toFixed(2)
2. Вы также можете увидеть это: плагины. jquery.com/df-number-format
Ответ №1:
Пожалуйста, взгляните на эту обновленную скрипку, я думаю, это должно сделать то, что вам нужно.
function FormatNumber(nStr) {
nStr = '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' x[1] : '';
var pattern = /(d )(d{3})/;
while (pattern.test(x1)) {
x1 = x1.replace(pattern, '$1' ',' '$2');
}
return x1 x2;
}
Комментарии:
1. Это сработало отлично! Когда я тестировал ранее, я был отключен от шаблона var. Большое спасибо за понимание!
Ответ №2:
Попробуйте это:
Примечание: приведенная ниже функция очень подробная для удобства чтения / понимания. Вероятно, вы захотите упростить его для производства
Вы бы изменили outputAmt.innerHTML = monthlyPayments.toFixed( 2 ) || 0
—> outputAmt.innerHTML = placeCommas(monthlyPayments);
function placeCommas(number) {
if (number !== null amp;amp; number !== undefined) {
number = number.toFixed(2);
var splitNum = number.split(".");
var num = splitNum[0];
var decimals = splitNum[1];
var numArr = num.split("").reverse();
var commaArr = [];
for (var i = 0; i < numArr.length; i ) {
commaArr.push(numArr[i]);
if (i !== numArr.length - 1 amp;amp; i % 3 === 2) {
commaArr.push(",");
}
}
num = commaArr.reverse().join("");
number = num "." decimals;
return number;
}
}
console.log(placeCommas(0));
console.log(placeCommas(10));
console.log(placeCommas(100));
console.log(placeCommas(1000));
console.log(placeCommas(10000));
console.log(placeCommas(100000));
console.log(placeCommas(1000000));
console.log(placeCommas(10000000));
console.log(placeCommas(100000000));
console.log(placeCommas(1000000000));
Ответ №3:
Не так удобно блокировать использование клавиш со стрелками или даже любой клавиши, если на то пошло. Ваши ограничения также удаляют возможность выделения текста с помощью стрелки shift, чтобы удалить ввод с помощью обратного пробела. И когда они перемещают положение курсора с помощью мыши, как только они вводят, курсор переворачивается до конца. Это ненормальное поведение, и пользователи будут разочарованы.
Пусть они вводят то, что хотят, и просто очищают, когда они выходят из поля ввода. Это намного удобнее для пользователя.
Поэтому я бы предложил применять формат чисел только тогда, когда фокус покидает поле ввода, и удалять все форматирование, как только фокус снова вводится.
Здесь также есть регулярное выражение replace
для применения форматирования за один раз:
$(this).val()
.replace(/[^d.]/gi, "") // clean-up
.replace(/B(d{3})(?=(?:d{3})*(?:.|$))/g, ',$1'); // format
Вот обновленная скрипка.