@@ -15,26 +15,26 @@ import UIKit
1515 didSet {
1616 value = min(maximumValue, max(minimumValue, value))
1717
18− let isInteger = floor(value) == value
19−
20− //
21− // If we have items, we will display them as steps
22− //
23−
24− if isInteger && stepValue == 1.0 && items.count > 0 {
25− label.text = items[Int(value)]
26− }
27− else if showIntegerIfDoubleIsInteger && isInteger {
28− label.text = String(stringInterpolationSegment: Int(value))
29− } else {
30− label.text = String(stringInterpolationSegment: value)
31− }
18+ label.text = formattedValue
3219
3320 if oldValue != value {
3421 sendActions(for: .valueChanged)
3522 }
3623 }
3724 }
25+
26+ private var formattedValue: String? {
27+ let isInteger = Decimal(value).exponent >= 0
28+
29+ // If we have items, we will display them as steps
30+ if isInteger && stepValue == 1.0 && items.count > 0 {
31+ return items[Int(value)]
32+ }
33+ else {
34+ return formatter.string(from: NSNumber(value: value))
35+ }
36+ }
37+
3838
3939 /// Minimum value. Must be less than maximumValue. Defaults to 0.
4040 @objc @IBInspectable public var minimumValue: Double = 0 {
@@ -51,13 +51,21 @@ import UIKit
5151 }
5252
5353 /// Step/Increment value as in UIStepper. Defaults to 1.
54− @objc @IBInspectable public var stepValue: Double = 1
54+ @objc @IBInspectable public var stepValue: Double = 1 {
55+ didSet {
56+ setupNumberFormatter()
57+ }
58+ }
5559
5660 /// The same as UIStepper's autorepeat. If true, holding on the buttons or keeping the pan gesture alters the value repeatedly. Defaults to true.
5761 @objc @IBInspectable public var autorepeat: Bool = true
5862
5963 /// If the value is integer, it is shown without floating point.
60− @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
64+ @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true {
65+ didSet {
66+ setupNumberFormatter()
67+ }
68+ }
6169
6270 /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
6371 @objc @IBInspectable public var leftButtonText: String = "−" {
@@ -164,6 +172,9 @@ import UIKit
164172 /// Color of the flashing animation on the buttons in case the value hit the limit.
165173 @objc @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
166174
175+ /// Formatter for displaying the current value
176+ let formatter = NumberFormatter()
177+
167178 /**
168179 Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
169180 */
@@ -204,11 +215,7 @@ import UIKit
204215 lazy var label: UILabel = {
205216 let label = UILabel()
206217 label.textAlignment = .center
207− if self.showIntegerIfDoubleIsInteger && floor(self.value) == self.value {
208− label.text = String(stringInterpolationSegment: Int(self.value))
209− } else {
210− label.text = String(stringInterpolationSegment: self.value)
211− }
218+ label.text = formattedValue
212219 label.textColor = self.labelTextColor
213220 label.backgroundColor = self.labelBackgroundColor
214221 label.font = self.labelFont
@@ -247,24 +254,7 @@ import UIKit
247254
248255 @objc public var items : [String] = [] {
249256 didSet {
250− let isInteger = floor(value) == value
251−
252− //
253− // If we have items, we will display them as steps
254− //
255−
256− if isInteger && stepValue == 1.0 && items.count > 0 {
257−
258− var value = Int(self.value)
259−
260− if value >= items.count {
261− value = items.count - 1
262− self.value = Double(value)
263− }
264− else {
265− label.text = items[value]
266− }
267− }
257+ label.text = formattedValue
268258 }
269259 }
270260
@@ -301,7 +291,7 @@ import UIKit
301291 setup()
302292 }
303293
304− func setup() {
294+ fileprivate func setup() {
305295 addSubview(leftButton)
306296 addSubview(rightButton)
307297 addSubview(label)
@@ -311,8 +301,18 @@ import UIKit
311301 clipsToBounds = true
312302 labelOriginalCenter = label.center
313303
304+ setupNumberFormatter()
305+
314306 NotificationCenter.default.addObserver(self, selector: #selector(GMStepper.reset), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
315307 }
308+
309+ func setupNumberFormatter() {
310+ let decValue = Decimal(stepValue)
311+ let digits = decValue.significantFractionalDecimalDigits
312+ formatter.minimumIntegerDigits = 1
313+ formatter.minimumFractionDigits = showIntegerIfDoubleIsInteger ? 0 : digits
314+ formatter.maximumFractionDigits = digits
315+ }
316316
317317 public override func layoutSubviews() {
318318 let buttonWidth = bounds.size.width * ((1 - labelWidthWeight) / 2)
@@ -332,8 +332,9 @@ import UIKit
332332 value += stepValue
333333 } else if stepperState == .ShouldDecrease {
334334 value -= stepValue
335− }
335+ }
336336 }
337+
337338
338339 deinit {
339340 resetTimer()
@@ -516,6 +517,11 @@ extension GMStepper {
516517 timerFireCount = 0
517518 }
518519 }
520+}
519521
520522
523+extension Decimal {
524+ var significantFractionalDecimalDigits: Int {
525+ return max(-exponent, 0)
526+ }
521527}