Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fix(Slider): fix precision when compute float number
fix #54
close #55
  • Loading branch information
ZxBing0066 committed Oct 18, 2018
1 parent 817ab66 commit fecb667
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 7 deletions.
31 changes: 28 additions & 3 deletions src/components/Slider/Slider.jsx
Expand Up @@ -35,6 +35,18 @@ handle.propTypes = {
tipFormatter: PropTypes.func
};

const getPrecision = n => {
const valueString = n.toString();
if (valueString.indexOf('e-') >= 0) {
return parseInt(valueString.slice(valueString.indexOf('e-') + 2), 10);
}
let precision = 0;
if (valueString.indexOf('.') >= 0) {
precision = valueString.length - valueString.indexOf('.') - 1;
}
return precision;
};

class Slider extends Component {
static propTypes = {
/** 值,受控 */
Expand All @@ -49,7 +61,7 @@ class Slider extends Component {
min: PropTypes.number,
/** 最大值 */
max: PropTypes.number,
/** 每次变动的大小,传入的最大值和最小值必须为step的整数倍 */
/** 每次变动的大小,传入的(最大值-最小值)必须为step的整数倍,大于0 */
step: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
/** 标记 */
marks: PropTypes.object,
Expand All @@ -74,7 +86,9 @@ class Slider extends Component {
static defaultProps = {
onChange: () => {},
step: 1,
size: 'md'
size: 'md',
min: 0,
max: 100
};
state = {
value: 'value' in this.props ? this.props.value : this.props.defaultValue
Expand Down Expand Up @@ -102,7 +116,18 @@ class Slider extends Component {
if (number > max) {
number = max;
}
number = ((number / step) | 0) * step;
const stepPrecision = getPrecision(step);
const numberPrecision = getPrecision(number);
const maxPrecision = getPrecision(max);
const minPrecision = getPrecision(min);
const precision = Math.max(stepPrecision, numberPrecision, maxPrecision, minPrecision);
number = +(((number - min) / step).toFixed(0) * step + min).toFixed(precision);
if (number < min) {
number = +(number + step).toFixed(precision);
}
if (number > max) {
number = +(number - step).toFixed(precision);
}
return _.isNaN(number) ? 0 : number;
};
render() {
Expand Down
43 changes: 39 additions & 4 deletions src/components/Slider/__tests__/__snapshots__/demo.test.js.snap
Expand Up @@ -137,6 +137,10 @@ exports[`Slider demo -- base 1`] = `
.c30 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c30 .uc-fe-slider-handle {
Expand Down Expand Up @@ -972,6 +976,10 @@ exports[`Slider demo -- disabled 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down Expand Up @@ -1379,6 +1387,10 @@ exports[`Slider demo -- marks 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down Expand Up @@ -1817,6 +1829,10 @@ exports[`Slider demo -- minmax 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down Expand Up @@ -2046,7 +2062,7 @@ exports[`Slider demo -- minmax 1`] = `
autocomplete="off"
class="c7 c8"
max="20"
min="-9007199254740991"
min="0"
step="1"
value="10"
/>
Expand Down Expand Up @@ -2114,7 +2130,8 @@ exports[`Slider demo -- minmax 1`] = `
<input
autocomplete="off"
class="c7 c8"
min="-9007199254740991"
max="100"
min="0"
step="1"
value="10"
/>
Expand Down Expand Up @@ -2291,6 +2308,10 @@ exports[`Slider demo -- numberInput 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down Expand Up @@ -2450,7 +2471,8 @@ exports[`Slider demo -- numberInput 1`] = `
<input
autocomplete="off"
class="c7 c8"
min="-9007199254740991"
max="100"
min="0"
step="1"
value="5"
/>
Expand Down Expand Up @@ -2518,7 +2540,8 @@ exports[`Slider demo -- numberInput 1`] = `
<input
autocomplete="off"
class="c7 c8"
min="-9007199254740991"
max="100"
min="0"
step="1"
value="10"
/>
Expand Down Expand Up @@ -2695,6 +2718,10 @@ exports[`Slider demo -- step 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down Expand Up @@ -3101,6 +3128,10 @@ exports[`Slider demo -- tipFormatter 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down Expand Up @@ -3507,6 +3538,10 @@ exports[`Slider demo -- uncontrolled 1`] = `
.c0 .uc-fe-slider-tooltip {
line-height: normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.c0 .uc-fe-slider-handle {
Expand Down
1 change: 1 addition & 0 deletions src/components/Slider/style/index.js
Expand Up @@ -51,6 +51,7 @@ export const SliderWrap = styled.div`
&-tooltip {
line-height: normal;
user-select: none;
}
&-handle {
Expand Down

0 comments on commit fecb667

Please sign in to comment.