Skip to content

Commit cd93fdc

Browse files
committed
NumberFormatter: Get properties as attributes
- Re-enable TestNumberFormatter.test_en_US_initialValues()
1 parent 8e587b8 commit cd93fdc

File tree

2 files changed

+87
-21
lines changed

2 files changed

+87
-21
lines changed

Foundation/NumberFormatter.swift

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ open class NumberFormatter : Formatter {
174174
CFNumberFormatterSetProperty(formatter, attributeName, value)
175175
}
176176
}
177+
178+
internal func _getFormatterAttribute(_ formatter: CFNumberFormatter, attributeName: CFString) -> String? {
179+
return CFNumberFormatterCopyProperty(formatter, attributeName) as? String
180+
}
181+
177182

178183
// Attributes of a NumberFormatter
179184
internal var _numberStyle: Style = .none
@@ -320,7 +325,7 @@ open class NumberFormatter : Formatter {
320325
internal var _decimalSeparator: String!
321326
open var decimalSeparator: String! {
322327
get {
323-
return _decimalSeparator
328+
return _decimalSeparator ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterDecimalSeparator)
324329
}
325330
set {
326331
_reset()
@@ -342,7 +347,7 @@ open class NumberFormatter : Formatter {
342347
internal var _currencyDecimalSeparator: String!
343348
open var currencyDecimalSeparator: String! {
344349
get {
345-
return _currencyDecimalSeparator
350+
return _currencyDecimalSeparator ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterCurrencyDecimalSeparator)
346351
}
347352
set {
348353
_reset()
@@ -364,7 +369,7 @@ open class NumberFormatter : Formatter {
364369
internal var _groupingSeparator: String!
365370
open var groupingSeparator: String! {
366371
get {
367-
return _groupingSeparator
372+
return _groupingSeparator ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterGroupingSeparator)
368373
}
369374
set {
370375
_reset()
@@ -377,7 +382,7 @@ open class NumberFormatter : Formatter {
377382
internal var _zeroSymbol: String?
378383
open var zeroSymbol: String? {
379384
get {
380-
return _zeroSymbol
385+
return _zeroSymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterZeroSymbol)
381386
}
382387
set {
383388
_reset()
@@ -421,7 +426,7 @@ open class NumberFormatter : Formatter {
421426
internal var _notANumberSymbol: String!
422427
open var notANumberSymbol: String! {
423428
get {
424-
return _notANumberSymbol
429+
return _notANumberSymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterNaNSymbol)
425430
}
426431
set {
427432
_reset()
@@ -489,7 +494,7 @@ open class NumberFormatter : Formatter {
489494
internal var _positivePrefix: String!
490495
open var positivePrefix: String! {
491496
get {
492-
return _positivePrefix
497+
return _positivePrefix ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterPositivePrefix)
493498
}
494499
set {
495500
_reset()
@@ -500,7 +505,7 @@ open class NumberFormatter : Formatter {
500505
internal var _positiveSuffix: String!
501506
open var positiveSuffix: String! {
502507
get {
503-
return _positiveSuffix
508+
return _positiveSuffix ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterPositiveSuffix)
504509
}
505510
set {
506511
_reset()
@@ -511,7 +516,7 @@ open class NumberFormatter : Formatter {
511516
internal var _negativePrefix: String!
512517
open var negativePrefix: String! {
513518
get {
514-
return _negativePrefix
519+
return _negativePrefix ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterNegativePrefix)
515520
}
516521
set {
517522
_reset()
@@ -522,7 +527,7 @@ open class NumberFormatter : Formatter {
522527
internal var _negativeSuffix: String!
523528
open var negativeSuffix: String! {
524529
get {
525-
return _negativeSuffix
530+
return _negativeSuffix ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterNegativeSuffix)
526531
}
527532
set {
528533
_reset()
@@ -533,7 +538,7 @@ open class NumberFormatter : Formatter {
533538
internal var _currencyCode: String!
534539
open var currencyCode: String! {
535540
get {
536-
return _currencyCode
541+
return _currencyCode ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterCurrencyCode)
537542
}
538543
set {
539544
_reset()
@@ -544,7 +549,7 @@ open class NumberFormatter : Formatter {
544549
internal var _currencySymbol: String!
545550
open var currencySymbol: String! {
546551
get {
547-
return _currencySymbol
552+
return _currencySymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterCurrencySymbol)
548553
}
549554
set {
550555
_reset()
@@ -555,7 +560,7 @@ open class NumberFormatter : Formatter {
555560
internal var _internationalCurrencySymbol: String!
556561
open var internationalCurrencySymbol: String! {
557562
get {
558-
return _internationalCurrencySymbol
563+
return _internationalCurrencySymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterInternationalCurrencySymbol)
559564
}
560565
set {
561566
_reset()
@@ -566,7 +571,7 @@ open class NumberFormatter : Formatter {
566571
internal var _percentSymbol: String!
567572
open var percentSymbol: String! {
568573
get {
569-
return _percentSymbol
574+
return _percentSymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterPercentSymbol) ?? "%"
570575
}
571576
set {
572577
_reset()
@@ -577,7 +582,7 @@ open class NumberFormatter : Formatter {
577582
internal var _perMillSymbol: String!
578583
open var perMillSymbol: String! {
579584
get {
580-
return _perMillSymbol
585+
return _perMillSymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterPerMillSymbol)
581586
}
582587
set {
583588
_reset()
@@ -588,7 +593,7 @@ open class NumberFormatter : Formatter {
588593
internal var _minusSign: String!
589594
open var minusSign: String! {
590595
get {
591-
return _minusSign
596+
return _minusSign ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterMinusSign)
592597
}
593598
set {
594599
_reset()
@@ -599,7 +604,7 @@ open class NumberFormatter : Formatter {
599604
internal var _plusSign: String!
600605
open var plusSign: String! {
601606
get {
602-
return _plusSign
607+
return _plusSign ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterPlusSign)
603608
}
604609
set {
605610
_reset()
@@ -610,7 +615,7 @@ open class NumberFormatter : Formatter {
610615
internal var _exponentSymbol: String!
611616
open var exponentSymbol: String! {
612617
get {
613-
return _exponentSymbol
618+
return _exponentSymbol ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterExponentSymbol)
614619
}
615620
set {
616621
_reset()
@@ -667,7 +672,7 @@ open class NumberFormatter : Formatter {
667672
internal var _paddingCharacter: String!
668673
open var paddingCharacter: String! {
669674
get {
670-
return _paddingCharacter
675+
return _paddingCharacter ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterPaddingCharacter)
671676
}
672677
set {
673678
_reset()
@@ -782,7 +787,7 @@ open class NumberFormatter : Formatter {
782787
internal var _currencyGroupingSeparator: String!
783788
open var currencyGroupingSeparator: String! {
784789
get {
785-
return _currencyGroupingSeparator
790+
return _currencyGroupingSeparator ?? _getFormatterAttribute(_cfFormatter, attributeName: kCFNumberFormatterCurrencyGroupingSeparator)
786791
}
787792
set {
788793
_reset()
@@ -889,6 +894,9 @@ open class NumberFormatter : Formatter {
889894
internal var _format: String?
890895
open var format: String {
891896
get {
897+
if _format == nil {
898+
_format = CFNumberFormatterGetFormat(_cfFormatter)._swiftObject
899+
}
892900
return _format ?? "#"
893901
}
894902
set {

TestFoundation/TestNumberFormatter.swift

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class TestNumberFormatter: XCTestCase {
5454
("test_maximumSignificantDigits", test_maximumSignificantDigits),
5555
("test_stringFor", test_stringFor),
5656
("test_numberFrom", test_numberFrom),
57-
//("test_en_US_initialValues", test_en_US_initialValues)
57+
("test_en_US_initialValues", test_en_US_initialValues),
58+
("test_pt_BR_initialValues", test_pt_BR_initialValues),
59+
("test_changingLocale", test_changingLocale),
5860
]
5961
}
6062

@@ -652,7 +654,7 @@ class TestNumberFormatter: XCTestCase {
652654
numberFormatter.locale = Locale(identifier: "en_US")
653655

654656
// TODO: Check if this is true for all versions...
655-
XCTAssertEqual(numberFormatter.format, "#;0;#")
657+
XCTAssertEqual(numberFormatter.format, "#")
656658

657659
XCTAssertEqual(numberFormatter.plusSign, "+")
658660
XCTAssertEqual(numberFormatter.minusSign, "-")
@@ -671,5 +673,61 @@ class TestNumberFormatter: XCTestCase {
671673
XCTAssertEqual(numberFormatter.exponentSymbol, "E")
672674
XCTAssertEqual(numberFormatter.groupingSeparator, ",")
673675
XCTAssertEqual(numberFormatter.paddingCharacter, " ")
676+
XCTAssertEqual(numberFormatter.currencyCode, "USD")
677+
XCTAssertEqual(numberFormatter.currencySymbol, "$")
678+
XCTAssertEqual(numberFormatter.currencyDecimalSeparator, ".")
679+
XCTAssertEqual(numberFormatter.currencyGroupingSeparator, ",")
680+
XCTAssertEqual(numberFormatter.internationalCurrencySymbol, "USD")
681+
XCTAssertNil(numberFormatter.zeroSymbol)
682+
}
683+
684+
func test_pt_BR_initialValues() {
685+
let numberFormatter = NumberFormatter();
686+
numberFormatter.locale = Locale(identifier: "pt_BR")
687+
688+
XCTAssertEqual(numberFormatter.format, "#")
689+
XCTAssertEqual(numberFormatter.plusSign, "+")
690+
XCTAssertEqual(numberFormatter.minusSign, "-")
691+
XCTAssertEqual(numberFormatter.decimalSeparator, ",")
692+
XCTAssertEqual(numberFormatter.groupingSeparator, ".")
693+
XCTAssertEqual(numberFormatter.nilSymbol, "")
694+
XCTAssertEqual(numberFormatter.notANumberSymbol, "NaN")
695+
XCTAssertEqual(numberFormatter.positiveInfinitySymbol, "+∞")
696+
XCTAssertEqual(numberFormatter.negativeInfinitySymbol, "-∞")
697+
XCTAssertEqual(numberFormatter.positivePrefix, "")
698+
XCTAssertEqual(numberFormatter.negativePrefix, "-")
699+
XCTAssertEqual(numberFormatter.positiveSuffix, "")
700+
XCTAssertEqual(numberFormatter.negativeSuffix, "")
701+
XCTAssertEqual(numberFormatter.percentSymbol, "%")
702+
XCTAssertEqual(numberFormatter.perMillSymbol, "")
703+
XCTAssertEqual(numberFormatter.exponentSymbol, "E")
704+
XCTAssertEqual(numberFormatter.groupingSeparator, ".")
705+
XCTAssertEqual(numberFormatter.paddingCharacter, " ")
706+
XCTAssertEqual(numberFormatter.currencyCode, "BRL")
707+
XCTAssertEqual(numberFormatter.currencySymbol, "R$")
708+
XCTAssertEqual(numberFormatter.currencyDecimalSeparator, ",")
709+
XCTAssertEqual(numberFormatter.currencyGroupingSeparator, ".")
710+
XCTAssertEqual(numberFormatter.internationalCurrencySymbol, "BRL")
711+
XCTAssertNil(numberFormatter.zeroSymbol)
712+
}
713+
714+
func test_changingLocale() {
715+
let numberFormatter = NumberFormatter()
716+
numberFormatter.locale = Locale(identifier: "fr_FR")
717+
718+
XCTAssertEqual(numberFormatter.currencyCode, "EUR")
719+
XCTAssertEqual(numberFormatter.currencySymbol, "")
720+
numberFormatter.currencySymbol = "E"
721+
XCTAssertEqual(numberFormatter.currencySymbol, "E")
722+
723+
numberFormatter.locale = Locale(identifier: "fr_FR")
724+
XCTAssertEqual(numberFormatter.currencySymbol, "E")
725+
726+
numberFormatter.locale = Locale(identifier: "en_GB")
727+
728+
XCTAssertEqual(numberFormatter.currencyCode, "GBP")
729+
XCTAssertEqual(numberFormatter.currencySymbol, "E")
730+
numberFormatter.currencySymbol = nil
731+
XCTAssertEqual(numberFormatter.currencySymbol, "£")
674732
}
675733
}

0 commit comments

Comments
 (0)