From 257021b1af4f5414fb71ada695d86bd51bb5dc04 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Scott=20Gonz=C3=A1lez?= Date: Fri, 12 Aug 2011 23:11:35 -0400 Subject: [PATCH] Spinner: Fixed precision when stepping. Thanks hughlomas --- tests/unit/spinner/spinner_core.js | 17 +++++++++++++++++ ui/jquery.ui.spinner.js | 13 +++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/unit/spinner/spinner_core.js b/tests/unit/spinner/spinner_core.js index 55b806a7f..1c2b7ae17 100644 --- a/tests/unit/spinner/spinner_core.js +++ b/tests/unit/spinner/spinner_core.js @@ -185,4 +185,21 @@ test( "focus text field when pressing button", function() { ok( element[ 0 ] === document.activeElement, "focused after" ); }); +test( "precision", function() { + expect( 2 ); + var element = $( "#spin" ).spinner({ + value: .05, + step: .0001 + }); + element.spinner( "stepUp" ); + equal( element.val(), "0.0501", "precision from step" ); + + element.spinner( "option", { + value: 1.05, + step: 1 + }); + element.spinner( "stepDown" ); + equal( element.val(), "0.05", "precision from value" ); +}); + })( jQuery ); diff --git a/ui/jquery.ui.spinner.js b/ui/jquery.ui.spinner.js index fa8b065fb..ffcead73d 100644 --- a/ui/jquery.ui.spinner.js +++ b/ui/jquery.ui.spinner.js @@ -228,10 +228,13 @@ $.widget( "ui.spinner", { this.counter = 1; } - var newVal = this.value() + step * this._increment( this.counter ); + var newVal = this.value() + step * this._increment( this.counter ), + // fix precision from bad JS floating point math + precision = Math.max( this._precision( this.value() ), + this._precision( this.options.step ) ); // clamp the new value - newVal = this._trimValue( newVal ); + newVal = this._trimValue( newVal.toFixed( precision ) ); if ( !this.spinning || this._trigger( "spin", event, { value: newVal } ) !== false) { this._value( newVal ); @@ -245,6 +248,12 @@ $.widget( "ui.spinner", { 1; }, + _precision: function( num ) { + var str = num.toString(), + decimal = str.indexOf( "." ); + return decimal === -1 ? 0 : str.length - decimal - 1; + }, + _trimValue: function( value ) { var options = this.options; -- 2.39.5