@@ -58,7 +58,12 @@ open class NumberFormatter : Formatter {
58
58
59
59
let obj = CFNumberFormatterCreate ( kCFAllocatorSystemDefault, locale. _cfObject, numberStyle) !
60
60
_setFormatterAttributes ( obj)
61
- if let format = _format {
61
+ if _positiveFormat != nil || _negativeFormat != nil {
62
+ var format = _positiveFormat ?? " # "
63
+ if let negative = _negativeFormat {
64
+ format. append ( " ; " )
65
+ format. append ( negative)
66
+ }
62
67
CFNumberFormatterSetFormat ( obj, format. _cfObject)
63
68
}
64
69
_currentCfFormatter = obj
@@ -255,17 +260,6 @@ open class NumberFormatter : Formatter {
255
260
}
256
261
}
257
262
258
- private var _negativeFormat : String !
259
- open var negativeFormat : String ! {
260
- get {
261
- return _negativeFormat
262
- }
263
- set {
264
- _reset ( )
265
- _negativeFormat = newValue
266
- }
267
- }
268
-
269
263
private var _textAttributesForNegativeValues : [ String : Any ] ?
270
264
open var textAttributesForNegativeValues : [ String : Any ] ? {
271
265
get {
@@ -277,17 +271,6 @@ open class NumberFormatter : Formatter {
277
271
}
278
272
}
279
273
280
- private var _positiveFormat : String !
281
- open var positiveFormat : String ! {
282
- get {
283
- return _positiveFormat
284
- }
285
- set {
286
- _reset ( )
287
- _positiveFormat = newValue
288
- }
289
- }
290
-
291
274
private var _textAttributesForPositiveValues : [ String : Any ] ?
292
275
open var textAttributesForPositiveValues : [ String : Any ] ? {
293
276
get {
@@ -368,7 +351,7 @@ open class NumberFormatter : Formatter {
368
351
private var _zeroSymbol : String ?
369
352
open var zeroSymbol : String ? {
370
353
get {
371
- return _zeroSymbol ?? _getFormatterAttribute ( _cfFormatter , attributeName : kCFNumberFormatterZeroSymbol )
354
+ return _zeroSymbol
372
355
}
373
356
set {
374
357
_reset ( )
@@ -865,17 +848,80 @@ open class NumberFormatter : Formatter {
865
848
}
866
849
}
867
850
868
- private var _format : String ?
851
+ private func getFormatterComponents( ) -> ( String , String ) {
852
+ let format = CFNumberFormatterGetFormat ( _cfFormatter) . _swiftObject
853
+ let components = format. components ( separatedBy: " ; " )
854
+ let positive = _positiveFormat ?? components. first ?? " # "
855
+ let negative = _negativeFormat ?? components. last ?? " # "
856
+ return ( positive, negative)
857
+ }
858
+
859
+ private func getZeroFormat( ) -> String {
860
+ return string ( from: 0 ) ?? " 0 "
861
+ }
862
+
869
863
open var format : String {
870
864
get {
871
- if _format == nil {
872
- _format = CFNumberFormatterGetFormat ( _cfFormatter) . _swiftObject
865
+ let ( p, n) = getFormatterComponents ( )
866
+ let z = _zeroSymbol ?? getZeroFormat ( )
867
+ return " \( p) ; \( z) ; \( n) "
868
+ }
869
+ set {
870
+ // Special case empty string
871
+ if newValue == " " {
872
+ _positiveFormat = " "
873
+ _negativeFormat = " - "
874
+ _zeroSymbol = " 0 "
875
+ _reset ( )
876
+ } else {
877
+ let components = newValue. components ( separatedBy: " ; " )
878
+ let count = components. count
879
+ guard count <= 3 else { return }
880
+ _reset ( )
881
+
882
+ _positiveFormat = components. first ?? " "
883
+ if count == 1 {
884
+ _negativeFormat = " - \( _positiveFormat ?? " " ) "
885
+ }
886
+ else if count == 2 {
887
+ _negativeFormat = components [ 1 ]
888
+ _zeroSymbol = getZeroFormat ( )
889
+ }
890
+ else if count == 3 {
891
+ _zeroSymbol = components [ 1 ]
892
+ _negativeFormat = components [ 2 ]
893
+ }
894
+
895
+ if _negativeFormat == nil {
896
+ _negativeFormat = getFormatterComponents ( ) . 1
897
+ }
898
+
899
+ if _zeroSymbol == nil {
900
+ _zeroSymbol = getZeroFormat ( )
901
+ }
873
902
}
874
- return _format ?? " # "
903
+ }
904
+ }
905
+
906
+ private var _positiveFormat : String !
907
+ open var positiveFormat : String ! {
908
+ get {
909
+ return getFormatterComponents ( ) . 0
910
+ }
911
+ set {
912
+ _reset ( )
913
+ _positiveFormat = newValue
914
+ }
915
+ }
916
+
917
+ private var _negativeFormat : String !
918
+ open var negativeFormat : String ! {
919
+ get {
920
+ return getFormatterComponents ( ) . 1
875
921
}
876
922
set {
877
923
_reset ( )
878
- _format = newValue
924
+ _negativeFormat = newValue
879
925
}
880
926
}
881
927
0 commit comments