function roundNumber(value, exp) { return decimalAdjust('round', value, exp); } function floorNumber(value, exp) { return decimalAdjust('floor', value, exp); } function ceilNumber(value, exp) { return decimalAdjust('ceil', value, exp); } function decimalAdjust(type, value, exp) { // If the exp is undefined or zero... if (typeof exp === 'undefined' || +exp === 0) { return Math[type](value); } value = +value; exp = +exp; // If the value is not a number or the exp is not an integer... if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) { return NaN; } // Shift value = value.toString().split('e'); value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp))); // Shift back value = value.toString().split('e'); return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)); }
Saturday, December 13, 2014
jQuery rounding number to nearest, flooring or ceiling as expected decimal point
jQuery Rounding Number To Nearest Interval Such: 0.05, 0.5, 0.1, 5, 10, 100
JSFIDDLE LINK ||| TEXT LINK
Html Content:<input type='text' name='number' style='width: 150px;' value='10.21'/> <input type='text' name='round' style='width: 50px;' value='0.25'/> <input type='text' name='dp' style='width: 50px;' value='2'/> <input type='button' name='check' value='Check'/> <div></div>
jQuery Content:
var div = $("div"); log("---------------------------------------------------------"); $("input[type='button']").click(function() { var number = parseFloat($("input[name='number']").val()); var round = parseFloat($("input[name='round']").val()); var dp = parseFloat($("input[name='dp']").val()); if (!isNaN(number) && !isNaN(round) && !isNaN(dp)) { var nn = roundInterval(number, round, dp, "up"); log("<br/>Rounding: " + numberToString(number, dp, true) + " using: " + round + "/" + "<span class='up-down'>Up</span>" + " as: " + numberToString(nn, dp, true)); var nn = roundInterval(number, round, dp, "down"); log("<br/>Rounding: " + numberToString(number, dp, true) + " using: " + round + "/" + "<span class='up-down'>Down</span>" + " as: " + numberToString(nn, dp, true)); log("---------------------------------------------------------"); } }); $("input[type='button']").trigger("click"); function roundInterval(number, interval, round, roundType) { if (round > 9) { round = 9; } else if (round < 0) { round = 0; } number = number > 999999999999999 ? 999999999999999 : number; var isMinus = false; if (number < 0) { isMinus = true; number = number * -1; } number = parseFloat(numberToString(number, round)); interval = parseFloat(numberToString(interval, round)); var multiplier = roundType == 'up' ? Math.ceil(number / interval) : Math.floor(number / interval); log("Multiplier: " + multiplier); log("As: " + number + "/" + interval + " :: " + (number/interval)); number = multiplier * interval; number = multiplier * interval; if (isMinus) { number = number * -1; } return parseFloat(number.toFixed(round)); } function numberToString(number, dp, asDp) { var format = '#'; if (asDp === undefined || asDp == null) { asDp = false; } if (dp !== undefined && dp != null && !isNaN(dp)) { if (dp > 9) { dp = 9; } } else { dp = 0; } if (dp > 0 && asDp) { format += "."; format += "0000000000".substr(0, dp); } else if (dp > 0) { format += "."; format += "##########".substr(0, dp); } number = number.toString(); var minus = number.substr(0, 1) == '-' ? '-' : ''; var ln = ""; if (number.lastIndexOf("e+") > -1) { ln = number.substr(0, number.lastIndexOf("e+")); for (var i = ln.length - 2; i < parseInt(number.substr(number.lastIndexOf("e+") + 1)); i++) { ln += "0"; } ln = ln.replace(/[^0-9]/g, ''); number = ln; } var tail = format.lastIndexOf('.'), nail = number.lastIndexOf('.'); if (nail < 0 && tail >= 0) { number = number + "." + format.substr(tail + 1, 1); nail = number.lastIndexOf('.'); } tail = tail > -1 && nail > -1 ? format.substr(tail) : ''; var numtail = number.substr(number.indexOf(".") ) ; if(tail.length > 0 && dp !== undefined && dp > 0) { tail = tail.substr(0, dp + 1); var tails = tail.split(''), ntail = "", canPop = true; for (var i = 1; i < tails.length; i++) { if ((tails[i] == '#' || tails[i].match(/([0-9])/g)) && numtail.length > i) { ntail += numtail.substr(i, 1); } else if(tails[i] == '#') { ntail += '0'; } else { ntail += tails[i]; } } var ttail = ntail.split(''), ptail = tail.substr(1).split(''); for(var i = ttail.length - 1; i > -1; i--){ if (ptail[i] == '#' && canPop && (ttail[i] == '0' || ttail[i] == '#')) { ntail = ntail.substr(0, ntail.length - 1); } else { canPop = false; } } if (ntail.length > 0) { tail = "." + ntail; } else { tail = ""; } } number = number.replace(/\..*|[^0-9]/g,'').split(''); format = format.replace(/\..*/g,'').split(''); for(var i = format.length - 1; i > -1; i--){ if(format[i] == '#') { format[i]=number.pop() } } number = minus + number.join('') + format.join('') + tail; return number; } function log(m) { div.prepend(m + "<br/>"); }
Subscribe to:
Posts (Atom)