diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 5e44fb03c6..d08b87993f 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -6,6 +6,7 @@ import './emby-slider.scss'; import 'webcomponents.js/webcomponents-lite'; import '../emby-input/emby-input'; import globalize from '../../scripts/globalize'; +import { decimalCount } from '../../utils/number'; const EmbySliderPrototype = Object.create(HTMLInputElement.prototype); @@ -75,13 +76,23 @@ function mapClientToFraction(range, clientX) { function mapFractionToValue(range, fraction) { let value = (range.max - range.min) * fraction; + let decimals = null; + // Snap to step if (range.step !== 'any') { const step = normalizeSliderStep(range); + decimals = decimalCount(step); value = Math.round(value / step) * step; } - value += parseFloat(range.min); + const min = parseFloat(range.min); + + value += min; + + if (decimals != null) { + decimals = Math.max(decimals, decimalCount(min)); + value = parseFloat(value.toFixed(decimals)); + } return Math.min(Math.max(value, range.min), range.max); } diff --git a/src/utils/number.ts b/src/utils/number.ts index 16797d7d51..553280c1fe 100644 --- a/src/utils/number.ts +++ b/src/utils/number.ts @@ -32,3 +32,16 @@ export function toPercent(value: number | null | undefined, locale: string): str return `${Math.round(value * 100)}%`; } + +/** + * Gets decimal count of a Number. + * @param {number} value Number. + * @returns {number} Decimal count of a Number. + */ +export function decimalCount(value: number): number { + if (Number.isInteger(value)) return 0; + + const arr = value.toString().split('.'); + + return arr[1].length; +}