@@ -24,7 +24,6 @@ import UIKit
24
24
25
25
- seealso: the ``NumberInputListener/formatter`` field
26
26
*/
27
- @available ( iOS 16 . 0 , tvOS 16 . 0 , * )
28
27
open class NumberInputListener : MaskedTextInputListener {
29
28
private static let decimalSeparator = " . "
30
29
@@ -141,11 +140,23 @@ open class NumberInputListener: MaskedTextInputListener {
141
140
142
141
let numberOfOccurrencesOfDecimalSeparator = digitsAndDecimalSeparators. numberOfOccurrencesOf ( NumberInputListener . decimalSeparator)
143
142
if numberOfOccurrencesOfDecimalSeparator > 1 {
144
- digitsAndDecimalSeparators =
145
- digitsAndDecimalSeparators
146
- . reversed
147
- . replacing ( NumberInputListener . decimalSeparator, with: " " , maxReplacements: numberOfOccurrencesOfDecimalSeparator - 1 )
148
- . reversed
143
+ if #available( iOS 16 . 0 , * ) {
144
+ digitsAndDecimalSeparators =
145
+ digitsAndDecimalSeparators
146
+ . reversed
147
+ . replacing ( NumberInputListener . decimalSeparator, with: " " , maxReplacements: numberOfOccurrencesOfDecimalSeparator - 1 )
148
+ . reversed
149
+ } else {
150
+ // TODO: remove
151
+ digitsAndDecimalSeparators = digitsAndDecimalSeparators. reversed
152
+ digitsAndDecimalSeparators = replace (
153
+ NumberInputListener . decimalSeparator,
154
+ in: digitsAndDecimalSeparators,
155
+ with: " " ,
156
+ maxReplacements: numberOfOccurrencesOfDecimalSeparator - 1
157
+ )
158
+ digitsAndDecimalSeparators = digitsAndDecimalSeparators. reversed
159
+ }
149
160
}
150
161
151
162
let components = digitsAndDecimalSeparators. components ( separatedBy: NumberInputListener . decimalSeparator)
@@ -183,6 +194,28 @@ open class NumberInputListener: MaskedTextInputListener {
183
194
]
184
195
return character
185
196
}
197
+
198
+ private func replace(
199
+ _ substring: String ,
200
+ in origin: String ,
201
+ with replacementSubstring: String ,
202
+ maxReplacements: Int
203
+ ) -> String {
204
+ var string = origin
205
+ var ranges : [ Range < String . Index > ] = [ ]
206
+ var start = string. startIndex
207
+ while start < string. endIndex,
208
+ let range = string. range ( of: substring, range: start..< string. endIndex) {
209
+ ranges. append ( range)
210
+ start = range. upperBound
211
+ if ranges. count == maxReplacements { break }
212
+ }
213
+
214
+ for range in ranges. reversed ( ) {
215
+ string. replaceSubrange ( range, with: replacementSubstring)
216
+ }
217
+ return string
218
+ }
186
219
}
187
220
188
221
#endif
0 commit comments