45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
$.fn.exponentialInput = function() {
|
|
var prefixes = {
|
|
'K': 3,
|
|
'M': 6,
|
|
'G': 9,
|
|
'T': 12
|
|
};
|
|
|
|
this.each(function(){
|
|
var $group = $(this);
|
|
var currentExponent = 0;
|
|
var $input = $group.find('input');
|
|
|
|
var setExponent = function() {
|
|
var newExponent = parseInt($exponent.val());
|
|
var delta = currentExponent - newExponent;
|
|
if (delta >= 0) {
|
|
$input.val(parseFloat($input.val()) * 10 ** delta);
|
|
} else {
|
|
// should not be necessary to handle this separately, but floating point precision in javascript
|
|
// does not handle this well otherwise
|
|
$input.val(parseFloat($input.val()) / 10 ** -delta);
|
|
}
|
|
currentExponent = newExponent;
|
|
};
|
|
|
|
$input.on('keydown', function(e) {
|
|
var c = String.fromCharCode(e.which);
|
|
if (c in prefixes) {
|
|
currentExponent = prefixes[c];
|
|
$exponent.val(prefixes[c]);
|
|
}
|
|
});
|
|
|
|
var $exponent = $group.find('select.exponent');
|
|
$exponent.on('change', setExponent);
|
|
|
|
// calculate initial exponent
|
|
var value = parseFloat($input.val());
|
|
if (!Number.isNaN(value)) {
|
|
$exponent.val(Math.floor(Math.log10(Math.abs(value)) / 3) * 3);
|
|
setExponent();
|
|
}
|
|
})
|
|
}; |