blob: d7433cf00c6dfe5cdb7326c544ba251c5bbbe39b [file] [log] [blame]
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
class TestNumberFormatter: XCTestCase {
func test_defaultPropertyValues() {
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.numberStyle, .none)
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 42)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "#;0;#")
XCTAssertEqual(numberFormatter.positiveFormat, "#")
XCTAssertEqual(numberFormatter.negativeFormat, "#")
XCTAssertNil(numberFormatter.multiplier)
XCTAssertFalse(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 0)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultDecimalPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 1)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 2_000_000_000)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 3)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "#,##0.###;0;#,##0.###")
XCTAssertEqual(numberFormatter.positiveFormat, "#,##0.###")
XCTAssertEqual(numberFormatter.negativeFormat, "#,##0.###")
XCTAssertNil(numberFormatter.multiplier)
XCTAssertTrue(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 3)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultCurrencyPropertyValues() {
let numberFormatter = NumberFormatter()
let currency = Locale.current.currencySymbol ?? ""
numberFormatter.numberStyle = .currency
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 1)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 2_000_000_000)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 2)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 2)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;\(currency)0.00;¤#,##0.00")
XCTAssertEqual(numberFormatter.positiveFormat, "¤#,##0.00")
XCTAssertEqual(numberFormatter.negativeFormat, "¤#,##0.00")
XCTAssertNil(numberFormatter.multiplier)
XCTAssertTrue(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 3)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultPercentPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .percent
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 1)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 2_000_000_000)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "#,##0%;0%;#,##0%")
XCTAssertEqual(numberFormatter.positiveFormat, "#,##0%")
XCTAssertEqual(numberFormatter.negativeFormat, "#,##0%")
XCTAssertEqual(numberFormatter.multiplier, NSNumber(100))
XCTAssertTrue(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 3)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultScientificPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .scientific
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 1)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
#if !DARWIN_COMPATIBILITY_TESTS
XCTAssertEqual(numberFormatter.format, "#E0;0E0;#E0")
#else
XCTAssertEqual(numberFormatter.format, "#E0;1E-100;#E0")
#endif
XCTAssertEqual(numberFormatter.positiveFormat, "#E0")
XCTAssertEqual(numberFormatter.negativeFormat, "#E0")
XCTAssertNil(numberFormatter.multiplier)
XCTAssertFalse(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 0)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultSpelloutPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 0)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 0)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
#if !DARWIN_COMPATIBILITY_TESTS
XCTAssertEqual(numberFormatter.format, "(null);zero;(null)")
#else
XCTAssertEqual(numberFormatter.format, "(null);zero point zero;(null)")
#endif
XCTAssertEqual(numberFormatter.positiveFormat, nil)
XCTAssertEqual(numberFormatter.negativeFormat, nil)
XCTAssertNil(numberFormatter.multiplier)
XCTAssertFalse(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 0)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultOrdinalPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .ordinal
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 0)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 0)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "(null);0th;(null)")
XCTAssertEqual(numberFormatter.positiveFormat, nil)
XCTAssertEqual(numberFormatter.negativeFormat, nil)
XCTAssertNil(numberFormatter.multiplier)
XCTAssertFalse(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 0)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultCurrencyISOCodePropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currencyISOCode
numberFormatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale(identifier: "en_US"))
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 1)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 2_000_000_000)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 2)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 2)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "¤¤#,##0.00;USD0.00;¤¤#,##0.00")
XCTAssertEqual(numberFormatter.positiveFormat, "¤¤#,##0.00")
XCTAssertEqual(numberFormatter.negativeFormat, "¤¤#,##0.00")
XCTAssertNil(numberFormatter.multiplier)
XCTAssertTrue(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 3)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
XCTAssertEqual(numberFormatter.string(from: NSNumber(1234567890)), "USD1,234,567,890.00")
}
func test_defaultCurrencyPluralPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currencyPlural
numberFormatter.locale = Locale(identifier: "en_GB")
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale(identifier: "en_GB"))
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 0)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 0)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "(null);0.00 British pounds;(null)")
XCTAssertEqual(numberFormatter.positiveFormat, nil)
XCTAssertEqual(numberFormatter.negativeFormat, nil)
XCTAssertNil(numberFormatter.multiplier)
XCTAssertFalse(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 0)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_defaultCurrenyAccountingPropertyValues() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currencyAccounting
numberFormatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 1)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 2_000_000_000)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 2)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 2)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;$0.00;(¤#,##0.00)")
XCTAssertEqual(numberFormatter.positiveFormat, "¤#,##0.00")
XCTAssertEqual(numberFormatter.negativeFormat, "(¤#,##0.00)")
XCTAssertNil(numberFormatter.multiplier)
XCTAssertTrue(numberFormatter.usesGroupingSeparator)
XCTAssertEqual(numberFormatter.groupingSize, 3)
XCTAssertEqual(numberFormatter.secondaryGroupingSize, 0)
}
func test_currencyCode() {
let numberFormatter = NumberFormatter()
numberFormatter.locale = Locale(identifier: "en_GB")
numberFormatter.numberStyle = .currency
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;£0.00;¤#,##0.00")
XCTAssertEqual(numberFormatter.string(from: 1.1), "£1.10")
XCTAssertEqual(numberFormatter.string(from: 0), "£0.00")
XCTAssertEqual(numberFormatter.string(from: -1.1), "-£1.10")
numberFormatter.currencyCode = "T"
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;T0.00;¤#,##0.00")
numberFormatter.currencyDecimalSeparator = "_"
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;T0_00;¤#,##0.00")
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "T42_00")
}
func test_decimalSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
XCTAssertEqual(numberFormatter.format, "#,##0.###;0;#,##0.###")
let separator = "-"
numberFormatter.decimalSeparator = separator
XCTAssertEqual(numberFormatter.format, "#,##0.###;0;#,##0.###")
XCTAssertEqual(numberFormatter.decimalSeparator, separator)
let formattedString = numberFormatter.string(from: 42.42)
XCTAssertEqual(formattedString, "42-42")
}
func test_currencyDecimalSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.currencyDecimalSeparator = "-"
numberFormatter.currencyCode = "T"
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;T0-00;¤#,##0.00")
let formattedString = numberFormatter.string(from: 42.42)
XCTAssertEqual(formattedString, "T42-42")
}
func test_alwaysShowDecimalSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.decimalSeparator = "-"
numberFormatter.alwaysShowsDecimalSeparator = true
XCTAssertEqual(numberFormatter.format, "#.;0-;#.")
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42-")
}
func test_groupingSeparator() {
let decFormatter1 = NumberFormatter()
XCTAssertEqual(decFormatter1.groupingSize, 0)
decFormatter1.numberStyle = .decimal
XCTAssertEqual(decFormatter1.groupingSize, 3)
XCTAssertEqual(decFormatter1.format, "#,##0.###;0;#,##0.###")
let decFormatter2 = NumberFormatter()
XCTAssertEqual(decFormatter2.groupingSize, 0)
decFormatter2.groupingSize = 1
decFormatter2.numberStyle = .decimal
XCTAssertEqual(decFormatter2.groupingSize, 1)
XCTAssertEqual(decFormatter2.format, "#,0.###;0;#,0.###")
let numberFormatter = NumberFormatter()
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSeparator = "_"
XCTAssertEqual(numberFormatter.groupingSize, 0)
XCTAssertEqual(numberFormatter.format, "#;0;#")
numberFormatter.groupingSize = 3
XCTAssertEqual(numberFormatter.format, "#,###;0;#,###")
let formattedString = numberFormatter.string(from: 42_000)
XCTAssertEqual(formattedString, "42_000")
}
func test_percentSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .percent
numberFormatter.percentSymbol = "💯"
XCTAssertEqual(numberFormatter.format, "#,##0%;0💯;#,##0%")
let formattedString = numberFormatter.string(from: 0.42)
XCTAssertEqual(formattedString, "42💯")
}
func test_zeroSymbol() {
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.numberStyle, .none)
XCTAssertEqual(numberFormatter.generatesDecimalNumbers, false)
XCTAssertEqual(numberFormatter.localizesFormat, true)
XCTAssertEqual(numberFormatter.locale, Locale.current)
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
XCTAssertEqual(numberFormatter.maximumIntegerDigits, 42)
XCTAssertEqual(numberFormatter.minimumFractionDigits, 0)
XCTAssertEqual(numberFormatter.maximumFractionDigits, 0)
XCTAssertEqual(numberFormatter.minimumSignificantDigits, 1)
XCTAssertEqual(numberFormatter.maximumSignificantDigits, 6)
XCTAssertEqual(numberFormatter.usesSignificantDigits, false)
XCTAssertEqual(numberFormatter.formatWidth, 0)
XCTAssertEqual(numberFormatter.format, "#;0;#")
numberFormatter.zeroSymbol = "⚽️"
XCTAssertEqual(numberFormatter.format, "#;⚽️;#")
let formattedString = numberFormatter.string(from: 0)
XCTAssertEqual(formattedString, "⚽️")
}
var unknownZero: Int = 0
func test_notANumberSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.notANumberSymbol = "👽"
XCTAssertEqual(numberFormatter.format, "#;0;#")
let number: Double = -42
let numberObject = NSNumber(value: sqrt(number))
let formattedString = numberFormatter.string(from: numberObject)
XCTAssertEqual(formattedString, "👽")
}
func test_positiveInfinitySymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.positiveInfinitySymbol = "🚀"
XCTAssertEqual(numberFormatter.format, "#;0;#")
let numberObject = NSNumber(value: Double(42.0) / Double(0))
let formattedString = numberFormatter.string(from: numberObject)
XCTAssertEqual(formattedString, "🚀")
}
func test_minusSignSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.minusSign = "👎"
XCTAssertEqual(numberFormatter.format, "#;0;#")
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "👎42")
}
func test_plusSignSymbol() {
// ex. 1.0E+1 in scientific notation
let numberFormatter = NumberFormatter()
let format = "#E+0"
numberFormatter.format = format
XCTAssertEqual(numberFormatter.positiveFormat, "#E+0")
XCTAssertEqual(numberFormatter.negativeFormat, "-#E+0")
#if !DARWIN_COMPATIBILITY_TESTS
XCTAssertEqual(numberFormatter.zeroSymbol, "0E+0")
XCTAssertEqual(numberFormatter.format, "#E+0;0E+0;-#E+0")
XCTAssertEqual(numberFormatter.string(from: 0), "0E+0")
#else
XCTAssertEqual(numberFormatter.zeroSymbol, "1E-100")
XCTAssertEqual(numberFormatter.format, "#E+0;1E-100;-#E+0")
XCTAssertEqual(numberFormatter.string(from: 0), "1E-100")
#endif
XCTAssertEqual(numberFormatter.plusSign, "+")
let sign = "👍"
numberFormatter.plusSign = sign
XCTAssertEqual(numberFormatter.plusSign, sign)
let formattedString = numberFormatter.string(from: 420000000000000000)
XCTAssertNotNil(formattedString)
XCTAssertEqual(formattedString, "4.2E👍17")
// Verify a negative exponent does not have the 👍
let noPlusString = numberFormatter.string(from: -0.420)
XCTAssertNotNil(noPlusString)
if let fmt = noPlusString {
let contains: Bool = fmt.contains(sign)
XCTAssertFalse(contains, "Expected format of -0.420 (-4.2E-1) shouldn't have a plus sign which was set as \(sign)")
}
}
func test_currencySymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.currencySymbol = "🍯"
numberFormatter.currencyDecimalSeparator = "_"
XCTAssertEqual(numberFormatter.format, "¤#,##0.00;🍯0_00;¤#,##0.00")
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "🍯42_00")
}
func test_exponentSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .scientific
numberFormatter.exponentSymbol = "⬆️"
#if DARWIN_COMPATIBILITY_TESTS
XCTAssertEqual(numberFormatter.format, "#E0;1⬆️-100;#E0")
#else
XCTAssertEqual(numberFormatter.format, "#E0;0⬆️0;#E0")
#endif
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "4.2⬆️1")
}
func test_decimalMinimumIntegerDigits() {
let numberFormatter1 = NumberFormatter()
XCTAssertEqual(numberFormatter1.minimumIntegerDigits, 0)
numberFormatter1.minimumIntegerDigits = 3
numberFormatter1.numberStyle = .decimal
XCTAssertEqual(numberFormatter1.minimumIntegerDigits, 3)
XCTAssertEqual(numberFormatter1.format, "#,000.###;000;#,000.###")
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 0)
numberFormatter.numberStyle = .decimal
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 1)
numberFormatter.minimumIntegerDigits = 3
XCTAssertEqual(numberFormatter.format, "#,000.###;000;#,000.###")
var formattedString = numberFormatter.string(from: 0)
XCTAssertEqual(formattedString, "000")
numberFormatter.numberStyle = .decimal
XCTAssertEqual(numberFormatter.minimumIntegerDigits, 3)
XCTAssertEqual(numberFormatter.format, "#,000.###;000;#,000.###")
formattedString = numberFormatter.string(from: 0.1)
XCTAssertEqual(formattedString, "000.1")
}
func test_currencyMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_GB")
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .currency
XCTAssertEqual(formatter.format, "¤#,###.00;£.00;¤#,###.00")
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.format, "¤#,###.00;$.00;¤#,###.00")
XCTAssertEqual(formatter.string(from: 0), "$.00")
XCTAssertEqual(formatter.string(from: 1.23), "$1.23")
XCTAssertEqual(formatter.string(from: 123.4), "$123.40")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
formatter2.locale = Locale(identifier: "en_GB")
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .currency
XCTAssertEqual(formatter2.format, "¤#,##0.00;£0.00;¤#,##0.00")
XCTAssertEqual(formatter2.minimumIntegerDigits, 1)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.001), "$0.00")
XCTAssertEqual(formatter2.string(from: 1.234), "$1.23")
XCTAssertEqual(formatter2.string(from: 123456.7), "$123,456.70")
}
func test_percentMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .percent
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "0%")
XCTAssertEqual(formatter.string(from: 1.234), "123%")
XCTAssertEqual(formatter.string(from: 123.4), "12,340%")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .percent
XCTAssertEqual(formatter2.minimumIntegerDigits, 1)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.01), "1%")
XCTAssertEqual(formatter2.string(from: 1.234), "123%")
XCTAssertEqual(formatter2.string(from: 123456.7), "12,345,670%")
}
func test_scientificMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .scientific
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "0E0")
XCTAssertEqual(formatter.string(from: 1.23), "1.23E0")
XCTAssertEqual(formatter.string(from: 123.4), "1.234E2")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .scientific
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.01), "1E-2")
XCTAssertEqual(formatter2.string(from: 1.234), "1.234E0")
XCTAssertEqual(formatter2.string(from: 123456.7), "1.234567E5")
}
func test_spellOutMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .spellOut
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "zero")
XCTAssertEqual(formatter.string(from: 1.23), "one point two three")
XCTAssertEqual(formatter.string(from: 123.4), "one hundred twenty-three point four")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .spellOut
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.01), "zero point zero one")
XCTAssertEqual(formatter2.string(from: 1.234), "one point two three four")
XCTAssertEqual(formatter2.string(from: 123456.7), "one hundred twenty-three thousand four hundred fifty-six point seven")
}
func test_ordinalMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .ordinal
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "0th")
XCTAssertEqual(formatter.string(from: 1.23), "1st")
XCTAssertEqual(formatter.string(from: 123.4), "123rd")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .ordinal
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.01), "0th")
XCTAssertEqual(formatter2.string(from: 4.234), "4th")
XCTAssertEqual(formatter2.string(from: 42), "42nd")
}
func test_currencyPluralMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .currencyPlural
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "0.00 US dollars")
XCTAssertEqual(formatter.string(from: 1.23), "1.23 US dollars")
XCTAssertEqual(formatter.string(from: 123.4), "123.40 US dollars")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .currencyPlural
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.01), "0.01 US dollars")
XCTAssertEqual(formatter2.string(from: 1.234), "1.23 US dollars")
XCTAssertEqual(formatter2.string(from: 123456.7), "123,456.70 US dollars")
}
func test_currencyISOCodeMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .currencyISOCode
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "USD.00")
XCTAssertEqual(formatter.string(from: 1.23), "USD1.23")
XCTAssertEqual(formatter.string(from: 123.4), "USD123.40")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .currencyISOCode
XCTAssertEqual(formatter2.minimumIntegerDigits, 1)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0.01), "USD0.01")
XCTAssertEqual(formatter2.string(from: 1.234), "USD1.23")
XCTAssertEqual(formatter2.string(from: 123456.7), "USD123,456.70")
}
func test_currencyAccountingMinimumIntegerDigits() {
// If .minimumIntegerDigits is set to 0 before .numberStyle change, preserve the value
let formatter = NumberFormatter()
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.minimumIntegerDigits = 0
formatter.numberStyle = .currencyAccounting
XCTAssertEqual(formatter.minimumIntegerDigits, 0)
formatter.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter.string(from: 0), "$.00")
XCTAssertEqual(formatter.string(from: 1.23), "$1.23")
XCTAssertEqual(formatter.string(from: 123.4), "$123.40")
// If .minimumIntegerDigits is not set before .numberStyle change, update the value
let formatter2 = NumberFormatter()
XCTAssertEqual(formatter2.minimumIntegerDigits, 0)
formatter2.numberStyle = .currencyAccounting
XCTAssertEqual(formatter2.minimumIntegerDigits, 1)
formatter2.locale = Locale(identifier: "en_US")
XCTAssertEqual(formatter2.string(from: 0), "$0.00")
XCTAssertEqual(formatter2.string(from: 1.23), "$1.23")
XCTAssertEqual(formatter2.string(from: 123.4), "$123.40")
}
func test_maximumIntegerDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.maximumIntegerDigits = 3
let formattedString = numberFormatter.string(from: 1_000)
XCTAssertEqual(formattedString, "000")
}
func test_minimumFractionDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.minimumFractionDigits = 3
numberFormatter.decimalSeparator = "-"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42-000")
}
func test_maximumFractionDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 3
numberFormatter.decimalSeparator = "-"
let formattedString = numberFormatter.string(from: 42.4242)
XCTAssertEqual(formattedString, "42-424")
}
func test_groupingSize() {
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.groupingSize, 0)
numberFormatter.groupingSize = 4
numberFormatter.groupingSeparator = "_"
numberFormatter.usesGroupingSeparator = true
let formattedString = numberFormatter.string(from: 42_000)
XCTAssertEqual(formattedString, "4_2000")
}
func test_secondaryGroupingSize() {
let numberFormatter = NumberFormatter()
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.groupingSeparator = "_"
numberFormatter.usesGroupingSeparator = true
let formattedString = numberFormatter.string(from: 42_000_000)
XCTAssertEqual(formattedString, "4_20_00_000")
}
func test_roundingMode() {
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 0
numberFormatter.roundingMode = .ceiling
let formattedString = numberFormatter.string(from: 41.0001)
XCTAssertEqual(formattedString, "42")
}
func test_roundingIncrement() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.roundingIncrement = 0.2
let formattedString = numberFormatter.string(from: 4.25)
XCTAssertEqual(formattedString, "4.2")
}
func test_formatWidth() {
let numberFormatter = NumberFormatter()
numberFormatter.paddingCharacter = "_"
numberFormatter.formatWidth = 5
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "___42")
}
func test_formatPosition() {
let numberFormatter = NumberFormatter()
numberFormatter.paddingCharacter = "_"
numberFormatter.formatWidth = 5
numberFormatter.paddingPosition = .afterPrefix
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "-__42")
}
func test_multiplier() {
let numberFormatter = NumberFormatter()
numberFormatter.multiplier = 2
let formattedString = numberFormatter.string(from: 21)
XCTAssertEqual(formattedString, "42")
}
func test_positivePrefix() {
let numberFormatter = NumberFormatter()
numberFormatter.positivePrefix = "👍"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "👍42")
}
func test_positiveSuffix() {
let numberFormatter = NumberFormatter()
numberFormatter.positiveSuffix = "👍"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42👍")
}
func test_negativePrefix() {
let numberFormatter = NumberFormatter()
numberFormatter.negativePrefix = "👎"
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "👎42")
}
func test_negativeSuffix() {
let numberFormatter = NumberFormatter()
numberFormatter.negativeSuffix = "👎"
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "-42👎")
}
func test_internationalCurrencySymbol() {
// What does internationalCurrencySymbol actually do?
#if false
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currencyPlural
numberFormatter.internationalCurrencySymbol = "💵"
numberFormatter.currencyDecimalSeparator = "_"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "💵42_00")
#endif
}
func test_currencyGroupingSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.currencyGroupingSeparator = "_"
numberFormatter.currencyCode = "T"
numberFormatter.currencyDecimalSeparator = "/"
let formattedString = numberFormatter.string(from: 42_000)
XCTAssertEqual(formattedString, "T42_000/00")
}
func test_lenient() {
let numberFormatter = NumberFormatter()
// Not lenient by default
XCTAssertFalse(numberFormatter.isLenient)
// Lenient allows wrong style -- not lenient here
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.numberStyle, .spellOut)
// let nilNumber = numberFormatter.number(from: "2.22")
// FIXME: Not nil on Linux?
//XCTAssertNil(nilNumber)
// Lenient allows wrong style
numberFormatter.isLenient = true
XCTAssertTrue(numberFormatter.isLenient)
let number = numberFormatter.number(from: "2.22")
XCTAssertEqual(number, 2.22)
// TODO: Add some tests with currency after [SR-250] resolved
numberFormatter.numberStyle = .currency
numberFormatter.isLenient = false
let nilNumberBeforeLenient = numberFormatter.number(from: "42")
XCTAssertNil(nilNumberBeforeLenient)
numberFormatter.isLenient = true
let numberAfterLenient = numberFormatter.number(from: "42.42")
XCTAssertEqual(numberAfterLenient, 42.42)
}
func test_minimumSignificantDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.minimumSignificantDigits = 3
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42.0")
}
func test_maximumSignificantDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
var formattedString = numberFormatter.string(from: 987654321)
XCTAssertEqual(formattedString, "987,654,321")
numberFormatter.usesSignificantDigits = true
numberFormatter.maximumSignificantDigits = 3
formattedString = numberFormatter.string(from: 42.42424242)
XCTAssertEqual(formattedString, "42.4")
}
func test_stringFor() {
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.string(for: 10)!, "10")
XCTAssertEqual(numberFormatter.string(for: 3.14285714285714)!, "3")
XCTAssertEqual(numberFormatter.string(for: true)!, "1")
XCTAssertEqual(numberFormatter.string(for: false)!, "0")
XCTAssertNil(numberFormatter.string(for: [1,2]))
XCTAssertEqual(numberFormatter.string(for: NSNumber(value: 99.1))!, "99")
XCTAssertNil(numberFormatter.string(for: "NaN"))
XCTAssertNil(numberFormatter.string(for: NSString(string: "NaN")))
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.string(for: 234), "two hundred thirty-four")
XCTAssertEqual(numberFormatter.string(for: 2007), "two thousand seven")
XCTAssertEqual(numberFormatter.string(for: 3), "three")
XCTAssertEqual(numberFormatter.string(for: 0.3), "zero point three")
numberFormatter.numberStyle = .decimal
XCTAssertEqual(numberFormatter.string(for: 234.5678), "234.568")
numberFormatter.locale = Locale(identifier: "zh_CN")
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.string(from: 11.4), "十一点四")
numberFormatter.locale = Locale(identifier: "fr_FR")
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.string(from: 11.4), "onze virgule quatre")
}
func test_numberFrom() {
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.number(from: "10"), 10)
XCTAssertEqual(numberFormatter.number(from: "3.14"), 3.14)
XCTAssertEqual(numberFormatter.number(from: "0.01"), 0.01)
XCTAssertEqual(numberFormatter.number(from: ".01"), 0.01)
// These don't work unless lenient/style set
numberFormatter.numberStyle = .decimal
XCTAssertEqual(numberFormatter.number(from: "1,001"), 1001)
XCTAssertEqual(numberFormatter.number(from: "1,050,001"), 1050001)
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.number(from: "two thousand and seven"), 2007)
XCTAssertEqual(numberFormatter.number(from: "one point zero"), 1.0)
XCTAssertEqual(numberFormatter.number(from: "one hundred million"), 1E8)
numberFormatter.locale = Locale(identifier: "zh_CN")
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.number(from: "十一点四"), 11.4)
numberFormatter.locale = Locale(identifier: "fr_FR")
numberFormatter.numberStyle = .spellOut
XCTAssertEqual(numberFormatter.number(from: "onze virgule quatre"), 11.4)
}
func test_en_US_initialValues() {
// Symbols should be extractable
// At one point, none of this passed!
let numberFormatter = NumberFormatter();
numberFormatter.locale = Locale(identifier: "en_US")
// TODO: Check if this is true for all versions...
XCTAssertEqual(numberFormatter.format, "#;0;#")
XCTAssertEqual(numberFormatter.plusSign, "+")
XCTAssertEqual(numberFormatter.minusSign, "-")
XCTAssertEqual(numberFormatter.decimalSeparator, ".")
XCTAssertEqual(numberFormatter.groupingSeparator, ",")
XCTAssertEqual(numberFormatter.nilSymbol, "")
XCTAssertEqual(numberFormatter.notANumberSymbol, "NaN")
XCTAssertEqual(numberFormatter.positiveInfinitySymbol, "+∞")
XCTAssertEqual(numberFormatter.negativeInfinitySymbol, "-∞")
XCTAssertEqual(numberFormatter.positivePrefix, "")
XCTAssertEqual(numberFormatter.negativePrefix, "-")
XCTAssertEqual(numberFormatter.positiveSuffix, "")
XCTAssertEqual(numberFormatter.negativeSuffix, "")
XCTAssertEqual(numberFormatter.percentSymbol, "%")
XCTAssertEqual(numberFormatter.perMillSymbol, "‰")
XCTAssertEqual(numberFormatter.exponentSymbol, "E")
XCTAssertEqual(numberFormatter.groupingSeparator, ",")
XCTAssertEqual(numberFormatter.paddingCharacter, " ")
XCTAssertEqual(numberFormatter.currencyCode, "USD")
XCTAssertEqual(numberFormatter.currencySymbol, "$")
XCTAssertEqual(numberFormatter.currencyDecimalSeparator, ".")
XCTAssertEqual(numberFormatter.currencyGroupingSeparator, ",")
XCTAssertEqual(numberFormatter.internationalCurrencySymbol, "USD")
XCTAssertNil(numberFormatter.zeroSymbol)
}
func test_pt_BR_initialValues() {
let numberFormatter = NumberFormatter();
numberFormatter.locale = Locale(identifier: "pt_BR")
XCTAssertEqual(numberFormatter.format, "#;0;#")
XCTAssertEqual(numberFormatter.plusSign, "+")
XCTAssertEqual(numberFormatter.minusSign, "-")
XCTAssertEqual(numberFormatter.decimalSeparator, ",")
XCTAssertEqual(numberFormatter.groupingSeparator, ".")
XCTAssertEqual(numberFormatter.nilSymbol, "")
XCTAssertEqual(numberFormatter.notANumberSymbol, "NaN")
XCTAssertEqual(numberFormatter.positiveInfinitySymbol, "+∞")
XCTAssertEqual(numberFormatter.negativeInfinitySymbol, "-∞")
XCTAssertEqual(numberFormatter.positivePrefix, "")
XCTAssertEqual(numberFormatter.negativePrefix, "-")
XCTAssertEqual(numberFormatter.positiveSuffix, "")
XCTAssertEqual(numberFormatter.negativeSuffix, "")
XCTAssertEqual(numberFormatter.percentSymbol, "%")
XCTAssertEqual(numberFormatter.perMillSymbol, "‰")
XCTAssertEqual(numberFormatter.exponentSymbol, "E")
XCTAssertEqual(numberFormatter.groupingSeparator, ".")
XCTAssertEqual(numberFormatter.paddingCharacter, " ")
XCTAssertEqual(numberFormatter.currencyCode, "BRL")
XCTAssertEqual(numberFormatter.currencySymbol, "R$")
XCTAssertEqual(numberFormatter.currencyDecimalSeparator, ",")
XCTAssertEqual(numberFormatter.currencyGroupingSeparator, ".")
XCTAssertEqual(numberFormatter.internationalCurrencySymbol, "BRL")
XCTAssertNil(numberFormatter.zeroSymbol)
}
func test_changingLocale() {
let numberFormatter = NumberFormatter()
numberFormatter.locale = Locale(identifier: "fr_FR")
XCTAssertEqual(numberFormatter.currencyCode, "EUR")
XCTAssertEqual(numberFormatter.currencySymbol, "€")
numberFormatter.currencySymbol = "E"
XCTAssertEqual(numberFormatter.currencySymbol, "E")
numberFormatter.locale = Locale(identifier: "fr_FR")
XCTAssertEqual(numberFormatter.currencySymbol, "E")
numberFormatter.locale = Locale(identifier: "en_GB")
XCTAssertEqual(numberFormatter.currencyCode, "GBP")
XCTAssertEqual(numberFormatter.currencySymbol, "E")
numberFormatter.currencySymbol = nil
XCTAssertEqual(numberFormatter.currencySymbol, "£")
}
func test_settingFormat() {
let formatter = NumberFormatter()
XCTAssertEqual(formatter.format, "#;0;#")
XCTAssertEqual(formatter.positiveFormat, "#")
XCTAssertEqual(formatter.zeroSymbol, nil)
XCTAssertEqual(formatter.negativeFormat, "#")
formatter.positiveFormat = "#"
XCTAssertEqual(formatter.format, "#;0;#")
XCTAssertEqual(formatter.positiveFormat, "#")
XCTAssertEqual(formatter.zeroSymbol, nil)
XCTAssertEqual(formatter.negativeFormat, "#")
formatter.positiveFormat = "##.##"
XCTAssertEqual(formatter.format, "##.##;0;#0.##")
XCTAssertEqual(formatter.positiveFormat, "##.##")
XCTAssertEqual(formatter.zeroSymbol, nil)
XCTAssertEqual(formatter.negativeFormat, "#0.##")
formatter.positiveFormat = "##;##"
XCTAssertEqual(formatter.format, "##;##;0;#")
XCTAssertEqual(formatter.positiveFormat, "##;##")
XCTAssertEqual(formatter.zeroSymbol, nil)
XCTAssertEqual(formatter.negativeFormat, "#")
formatter.positiveFormat = "+#.#########"
XCTAssertEqual(formatter.format, "+#.#########;+0;+#0.#########")
XCTAssertEqual(formatter.positiveFormat, "+#.#########")
XCTAssertEqual(formatter.zeroSymbol, nil)
XCTAssertEqual(formatter.negativeFormat, "+#0.#########")
formatter.negativeFormat = "-#.#########"
XCTAssertEqual(formatter.format, "+#.#########;+0;-#.#########")
XCTAssertEqual(formatter.positiveFormat, "+#.#########")
XCTAssertEqual(formatter.zeroSymbol, nil)
XCTAssertEqual(formatter.negativeFormat, "-#.#########")
formatter.format = "+++#;000;---#.##"
XCTAssertEqual(formatter.format, "+++#;000;---#.##")
XCTAssertEqual(formatter.positiveFormat, "+++#")
XCTAssertEqual(formatter.zeroSymbol, "000")
XCTAssertEqual(formatter.negativeFormat, "---#.##")
formatter.positiveFormat = nil
XCTAssertEqual(formatter.positiveFormat, "#")
XCTAssertEqual(formatter.format, "#;000;---#.##")
formatter.zeroSymbol = "00"
formatter.positiveFormat = "+++#.#"
XCTAssertEqual(formatter.format, "+++#.#;00;---#.##")
XCTAssertEqual(formatter.positiveFormat, "+++#.#")
XCTAssertEqual(formatter.zeroSymbol, "00")
XCTAssertEqual(formatter.negativeFormat, "---#.##")
formatter.negativeFormat = "---#.#"
XCTAssertEqual(formatter.format, "+++#.#;00;---#.#")
XCTAssertEqual(formatter.positiveFormat, "+++#.#")
XCTAssertEqual(formatter.zeroSymbol, "00")
XCTAssertEqual(formatter.negativeFormat, "---#.#")
// Test setting only first 2 parts
formatter.format = "+##.##;0.00"
#if !DARWIN_COMPATIBILITY_TESTS
XCTAssertEqual(formatter.format, "+##.##;00;0.00")
XCTAssertEqual(formatter.zeroSymbol, "00")
#else
XCTAssertEqual(formatter.format, "+##.##;+0;0.00")
XCTAssertEqual(formatter.zeroSymbol, "+0")
#endif
XCTAssertEqual(formatter.positiveFormat, "+##.##")
XCTAssertEqual(formatter.negativeFormat, "0.00")
formatter.format = "+##.##;+0;0.00"
XCTAssertEqual(formatter.format, "+##.##;+0;0.00")
XCTAssertEqual(formatter.positiveFormat, "+##.##")
XCTAssertEqual(formatter.zeroSymbol, "+0")
XCTAssertEqual(formatter.negativeFormat, "0.00")
formatter.format = "#;0;#"
formatter.positiveFormat = "1"
XCTAssertEqual(formatter.format, "1;0;#")
XCTAssertEqual(formatter.positiveFormat, "1")
XCTAssertEqual(formatter.zeroSymbol, "0")
XCTAssertEqual(formatter.negativeFormat, "#")
formatter.format = "1"
XCTAssertEqual(formatter.format, "1;0;-1")
XCTAssertEqual(formatter.positiveFormat, "1")
XCTAssertEqual(formatter.zeroSymbol, "0")
XCTAssertEqual(formatter.negativeFormat, "-1")
formatter.format = "1;2;3"
XCTAssertEqual(formatter.format, "1;2;3")
XCTAssertEqual(formatter.positiveFormat, "1")
XCTAssertEqual(formatter.zeroSymbol, "2")
XCTAssertEqual(formatter.negativeFormat, "3")
formatter.format = ""
#if !DARWIN_COMPATIBILITY_TESTS
XCTAssertEqual(formatter.format, ";0;-")
XCTAssertEqual(formatter.zeroSymbol, "0")
#else
XCTAssertEqual(formatter.format, ";0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;-")
XCTAssertEqual(formatter.zeroSymbol, "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001")
#endif
XCTAssertEqual(formatter.positiveFormat, "")
XCTAssertEqual(formatter.negativeFormat, "-")
}
func test_usingFormat() {
var formatter = NumberFormatter()
formatter.format = "+++#.#;00;-+-#.#"
XCTAssertEqual(formatter.string(from: 1), "+++1")
XCTAssertEqual(formatter.string(from: Int.max as NSNumber), "+++9223372036854775807")
XCTAssertEqual(formatter.string(from: 0), "00")
XCTAssertEqual(formatter.string(from: -1), "-+-1")
XCTAssertEqual(formatter.string(from: Int.min as NSNumber), "-+-9223372036854775808")
formatter.format = "+#.##;0.00;-#.##"
XCTAssertEqual(formatter.string(from: 0.5), "+0.5")
XCTAssertEqual(formatter.string(from: 0), "0.00")
XCTAssertEqual(formatter.string(from: -0.2), "-0.2")
formatter.positiveFormat = "#.##"
formatter.negativeFormat = "-#.##"
XCTAssertEqual(formatter.string(from: NSNumber(value: Double.pi)), "3.14")
XCTAssertEqual(formatter.string(from: NSNumber(value: -Double.pi)), "-3.14")
formatter = NumberFormatter()
formatter.negativeFormat = "--#.##"
XCTAssertEqual(formatter.string(from: NSNumber(value: -Double.pi)), "--3")
formatter.positiveFormat = "#.###"
XCTAssertEqual(formatter.string(from: NSNumber(value: Double.pi)), "3.142")
formatter.positiveFormat = "#.####"
XCTAssertEqual(formatter.string(from: NSNumber(value: Double.pi)), "3.1416")
formatter.positiveFormat = "#.#####"
XCTAssertEqual(formatter.string(from: NSNumber(value: Double.pi)), "3.14159")
formatter = NumberFormatter()
formatter.negativeFormat = "#.#########"
formatter.positiveFormat = "#.#########"
XCTAssertEqual(formatter.string(from: NSNumber(value: 0.5)), "0.5")
XCTAssertEqual(formatter.string(from: NSNumber(value: -0.5)), "-0.5")
}
func test_propertyChanges() {
let formatter = NumberFormatter()
XCTAssertNil(formatter.multiplier)
formatter.numberStyle = .percent
XCTAssertEqual(formatter.multiplier, NSNumber(100))
formatter.numberStyle = .decimal
XCTAssertNil(formatter.multiplier)
formatter.multiplier = NSNumber(1)
formatter.numberStyle = .percent
XCTAssertEqual(formatter.multiplier, NSNumber(1))
formatter.multiplier = NSNumber(27)
formatter.numberStyle = .decimal
XCTAssertEqual(formatter.multiplier, NSNumber(27))
}
static var allTests: [(String, (TestNumberFormatter) -> () throws -> Void)] {
return [
("test_defaultPropertyValues", test_defaultPropertyValues),
("test_defaultDecimalPropertyValues", test_defaultDecimalPropertyValues),
("test_defaultCurrencyPropertyValues", test_defaultCurrencyPropertyValues),
("test_defaultPercentPropertyValues", test_defaultPercentPropertyValues),
("test_defaultScientificPropertyValues", test_defaultScientificPropertyValues),
("test_defaultSpelloutPropertyValues", test_defaultSpelloutPropertyValues),
("test_defaultOrdinalPropertyValues", test_defaultOrdinalPropertyValues),
("test_defaultCurrencyISOCodePropertyValues", test_defaultCurrencyISOCodePropertyValues),
("test_defaultCurrencyPluralPropertyValues", test_defaultCurrencyPluralPropertyValues),
("test_defaultCurrenyAccountingPropertyValues", test_defaultCurrenyAccountingPropertyValues),
("test_currencyCode", test_currencyCode),
("test_decimalSeparator", test_decimalSeparator),
("test_currencyDecimalSeparator", test_currencyDecimalSeparator),
("test_alwaysShowDecimalSeparator", test_alwaysShowDecimalSeparator),
("test_groupingSeparator", test_groupingSeparator),
("test_percentSymbol", test_percentSymbol),
("test_zeroSymbol", test_zeroSymbol),
("test_notANumberSymbol", test_notANumberSymbol),
("test_positiveInfinitySymbol", test_positiveInfinitySymbol),
("test_minusSignSymbol", test_minusSignSymbol),
("test_plusSignSymbol", test_plusSignSymbol),
("test_currencySymbol", test_currencySymbol),
("test_exponentSymbol", test_exponentSymbol),
("test_decimalMinimumIntegerDigits", test_decimalMinimumIntegerDigits),
("test_currencyMinimumIntegerDigits", test_currencyMinimumIntegerDigits),
("test_percentMinimumIntegerDigits", test_percentMinimumIntegerDigits),
("test_scientificMinimumIntegerDigits", test_scientificMinimumIntegerDigits),
("test_spellOutMinimumIntegerDigits", test_spellOutMinimumIntegerDigits),
("test_ordinalMinimumIntegerDigits", test_ordinalMinimumIntegerDigits),
("test_currencyPluralMinimumIntegerDigits", test_currencyPluralMinimumIntegerDigits),
("test_currencyISOCodeMinimumIntegerDigits", test_currencyISOCodeMinimumIntegerDigits),
("test_currencyAccountingMinimumIntegerDigits", test_currencyAccountingMinimumIntegerDigits),
("test_maximumIntegerDigits", test_maximumIntegerDigits),
("test_minimumFractionDigits", test_minimumFractionDigits),
("test_maximumFractionDigits", test_maximumFractionDigits),
("test_groupingSize", test_groupingSize),
("test_secondaryGroupingSize", test_secondaryGroupingSize),
("test_roundingMode", test_roundingMode),
("test_roundingIncrement", test_roundingIncrement),
("test_formatWidth", test_formatWidth),
("test_formatPosition", test_formatPosition),
("test_multiplier", test_multiplier),
("test_positivePrefix", test_positivePrefix),
("test_positiveSuffix", test_positiveSuffix),
("test_negativePrefix", test_negativePrefix),
("test_negativeSuffix", test_negativeSuffix),
("test_internationalCurrencySymbol", test_internationalCurrencySymbol),
("test_currencyGroupingSeparator", test_currencyGroupingSeparator),
("test_lenient", test_lenient),
("test_minimumSignificantDigits", test_minimumSignificantDigits),
("test_maximumSignificantDigits", test_maximumSignificantDigits),
("test_stringFor", test_stringFor),
("test_numberFrom", test_numberFrom),
("test_en_US_initialValues", test_en_US_initialValues),
("test_pt_BR_initialValues", test_pt_BR_initialValues),
("test_changingLocale", test_changingLocale),
("test_settingFormat", test_settingFormat),
("test_usingFormat", test_usingFormat),
("test_propertyChanges", test_propertyChanges),
]
}
}