| // 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 |
| // |
| |
| import CoreFoundation |
| |
| #if os(OSX) || os(iOS) |
| internal let kCFNumberFormatterNoStyle = CFNumberFormatterStyle.noStyle |
| internal let kCFNumberFormatterDecimalStyle = CFNumberFormatterStyle.decimalStyle |
| internal let kCFNumberFormatterCurrencyStyle = CFNumberFormatterStyle.currencyStyle |
| internal let kCFNumberFormatterPercentStyle = CFNumberFormatterStyle.percentStyle |
| internal let kCFNumberFormatterScientificStyle = CFNumberFormatterStyle.scientificStyle |
| internal let kCFNumberFormatterSpellOutStyle = CFNumberFormatterStyle.spellOutStyle |
| internal let kCFNumberFormatterOrdinalStyle = CFNumberFormatterStyle.ordinalStyle |
| internal let kCFNumberFormatterCurrencyISOCodeStyle = CFNumberFormatterStyle.currencyISOCodeStyle |
| internal let kCFNumberFormatterCurrencyPluralStyle = CFNumberFormatterStyle.currencyPluralStyle |
| internal let kCFNumberFormatterCurrencyAccountingStyle = CFNumberFormatterStyle.currencyAccountingStyle |
| #endif |
| |
| extension NumberFormatter { |
| public enum Style : UInt { |
| case none |
| case decimal |
| case currency |
| case percent |
| case scientific |
| case spellOut |
| case ordinal |
| case currencyISOCode |
| case currencyPlural |
| case currencyAccounting |
| } |
| |
| public enum PadPosition : UInt { |
| case beforePrefix |
| case afterPrefix |
| case beforeSuffix |
| case afterSuffix |
| } |
| |
| public enum RoundingMode : UInt { |
| case ceiling |
| case floor |
| case down |
| case up |
| case halfEven |
| case halfDown |
| case halfUp |
| } |
| } |
| |
| open class NumberFormatter : Formatter { |
| |
| typealias CFType = CFNumberFormatter |
| private var _currentCfFormatter: CFType? |
| private var _cfFormatter: CFType { |
| if let obj = _currentCfFormatter { |
| return obj |
| } else { |
| #if os(OSX) || os(iOS) |
| let numberStyle = CFNumberFormatterStyle(rawValue: CFIndex(self.numberStyle.rawValue))! |
| #else |
| let numberStyle = CFNumberFormatterStyle(self.numberStyle.rawValue) |
| #endif |
| |
| let obj = CFNumberFormatterCreate(kCFAllocatorSystemDefault, locale._cfObject, numberStyle)! |
| _setFormatterAttributes(obj) |
| if let format = _format { |
| CFNumberFormatterSetFormat(obj, format._cfObject) |
| } |
| _currentCfFormatter = obj |
| return obj |
| } |
| } |
| |
| // this is for NSUnitFormatter |
| |
| open var formattingContext: Context = .unknown // default is NSFormattingContextUnknown |
| |
| // Report the used range of the string and an NSError, in addition to the usual stuff from Formatter |
| /// - Experiment: This is a draft API currently under consideration for official import into Foundation as a suitable alternative |
| /// - Note: Since this API is under consideration it may be either removed or revised in the near future |
| open func objectValue(_ string: String, range: inout NSRange) throws -> Any? { NSUnimplemented() } |
| |
| open override func string(for obj: Any) -> String? { |
| //we need to allow Swift's numeric types here - Int, Double et al. |
| guard let number = _SwiftValue.store(obj) as? NSNumber else { return nil } |
| return string(from: number) |
| } |
| |
| // Even though NumberFormatter responds to the usual Formatter methods, |
| // here are some convenience methods which are a little more obvious. |
| open func string(from number: NSNumber) -> String? { |
| return CFNumberFormatterCreateStringWithNumber(kCFAllocatorSystemDefault, _cfFormatter, number._cfObject)._swiftObject |
| } |
| |
| open func number(from string: String) -> NSNumber? { |
| var range = CFRange(location: 0, length: string.length) |
| let number = withUnsafeMutablePointer(to: &range) { (rangePointer: UnsafeMutablePointer<CFRange>) -> NSNumber? in |
| |
| #if os(OSX) || os(iOS) |
| let parseOption = allowsFloats ? 0 : CFNumberFormatterOptionFlags.parseIntegersOnly.rawValue |
| #else |
| let parseOption = allowsFloats ? 0 : CFOptionFlags(kCFNumberFormatterParseIntegersOnly) |
| #endif |
| let result = CFNumberFormatterCreateNumberFromString(kCFAllocatorSystemDefault, _cfFormatter, string._cfObject, rangePointer, parseOption) |
| |
| return result?._nsObject |
| } |
| return number |
| } |
| |
| open class func localizedString(from num: NSNumber, number nstyle: Style) -> String { |
| let numberFormatter = NumberFormatter() |
| numberFormatter.numberStyle = nstyle |
| return numberFormatter.string(for: num)! |
| } |
| |
| internal func _reset() { |
| _currentCfFormatter = nil |
| } |
| |
| internal func _setFormatterAttributes(_ formatter: CFNumberFormatter) { |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterCurrencyCode, value: _currencyCode?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterDecimalSeparator, value: _decimalSeparator?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterCurrencyDecimalSeparator, value: _currencyDecimalSeparator?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterAlwaysShowDecimalSeparator, value: _alwaysShowsDecimalSeparator._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterGroupingSeparator, value: _groupingSeparator?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterUseGroupingSeparator, value: _usesGroupingSeparator._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPercentSymbol, value: _percentSymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterZeroSymbol, value: _zeroSymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterNaNSymbol, value: _notANumberSymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterInfinitySymbol, value: _positiveInfinitySymbol._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMinusSign, value: _minusSign?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPlusSign, value: _plusSign?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterCurrencySymbol, value: _currencySymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterExponentSymbol, value: _exponentSymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMinIntegerDigits, value: _minimumIntegerDigits._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMaxIntegerDigits, value: _maximumIntegerDigits._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMinFractionDigits, value: _minimumFractionDigits._bridgeToObjectiveC()._cfObject) |
| if _minimumFractionDigits <= 0 { |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMaxFractionDigits, value: _maximumFractionDigits._bridgeToObjectiveC()._cfObject) |
| } |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterGroupingSize, value: _groupingSize._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterSecondaryGroupingSize, value: _secondaryGroupingSize._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterRoundingMode, value: _roundingMode.rawValue._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterRoundingIncrement, value: _roundingIncrement?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterFormatWidth, value: _formatWidth._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPaddingCharacter, value: _paddingCharacter?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPaddingPosition, value: _paddingPosition.rawValue._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMultiplier, value: _multiplier?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPositivePrefix, value: _positivePrefix?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPositiveSuffix, value: _positiveSuffix?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterNegativePrefix, value: _negativePrefix?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterNegativeSuffix, value: _negativeSuffix?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterPerMillSymbol, value: _percentSymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterInternationalCurrencySymbol, value: _internationalCurrencySymbol?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterCurrencyGroupingSeparator, value: _currencyGroupingSeparator?._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterIsLenient, value: _lenient._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterUseSignificantDigits, value: _usesSignificantDigits._cfObject) |
| if _usesSignificantDigits { |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMinSignificantDigits, value: _minimumSignificantDigits._bridgeToObjectiveC()._cfObject) |
| _setFormatterAttribute(formatter, attributeName: kCFNumberFormatterMaxSignificantDigits, value: _maximumSignificantDigits._bridgeToObjectiveC()._cfObject) |
| } |
| } |
| |
| internal func _setFormatterAttribute(_ formatter: CFNumberFormatter, attributeName: CFString, value: AnyObject?) { |
| if let value = value { |
| CFNumberFormatterSetProperty(formatter, attributeName, value) |
| } |
| } |
| |
| // Attributes of a NumberFormatter |
| internal var _numberStyle: Style = .none |
| open var numberStyle: Style { |
| get { |
| return _numberStyle |
| } |
| |
| set { |
| switch newValue { |
| case .none, .ordinal, .spellOut: |
| _usesSignificantDigits = false |
| |
| case .currency, .currencyPlural, .currencyISOCode, .currencyAccounting: |
| _usesSignificantDigits = false |
| _usesGroupingSeparator = true |
| _minimumFractionDigits = 2 |
| |
| case .decimal: |
| _usesGroupingSeparator = true |
| _maximumFractionDigits = 3 |
| _minimumIntegerDigits = 1 |
| |
| default: |
| _usesSignificantDigits = true |
| _usesGroupingSeparator = true |
| } |
| _reset() |
| _numberStyle = newValue |
| } |
| } |
| |
| internal var _locale: Locale = Locale.current |
| /*@NSCopying*/ open var locale: Locale! { |
| get { |
| return _locale |
| } |
| set { |
| _reset() |
| _locale = newValue |
| } |
| } |
| |
| internal var _generatesDecimalNumbers: Bool = false |
| open var generatesDecimalNumbers: Bool { |
| get { |
| return _generatesDecimalNumbers |
| } |
| set { |
| _reset() |
| _generatesDecimalNumbers = newValue |
| } |
| } |
| |
| internal var _negativeFormat: String! |
| open var negativeFormat: String! { |
| get { |
| return _negativeFormat |
| } |
| set { |
| _reset() |
| _negativeFormat = newValue |
| } |
| } |
| |
| internal var _textAttributesForNegativeValues: [String : Any]? |
| open var textAttributesForNegativeValues: [String : Any]? { |
| get { |
| return _textAttributesForNegativeValues |
| } |
| set { |
| _reset() |
| _textAttributesForNegativeValues = newValue |
| } |
| } |
| |
| internal var _positiveFormat: String! |
| open var positiveFormat: String! { |
| get { |
| return _positiveFormat |
| } |
| set { |
| _reset() |
| _positiveFormat = newValue |
| } |
| } |
| |
| internal var _textAttributesForPositiveValues: [String : Any]? |
| open var textAttributesForPositiveValues: [String : Any]? { |
| get { |
| return _textAttributesForPositiveValues |
| } |
| set { |
| _reset() |
| _textAttributesForPositiveValues = newValue |
| } |
| } |
| |
| internal var _allowsFloats: Bool = true |
| open var allowsFloats: Bool { |
| get { |
| return _allowsFloats |
| } |
| set { |
| _reset() |
| _allowsFloats = newValue |
| } |
| } |
| |
| internal var _decimalSeparator: String! |
| open var decimalSeparator: String! { |
| get { |
| return _decimalSeparator |
| } |
| set { |
| _reset() |
| _decimalSeparator = newValue |
| } |
| } |
| |
| internal var _alwaysShowsDecimalSeparator: Bool = false |
| open var alwaysShowsDecimalSeparator: Bool { |
| get { |
| return _alwaysShowsDecimalSeparator |
| } |
| set { |
| _reset() |
| _alwaysShowsDecimalSeparator = newValue |
| } |
| } |
| |
| internal var _currencyDecimalSeparator: String! |
| open var currencyDecimalSeparator: String! { |
| get { |
| return _currencyDecimalSeparator |
| } |
| set { |
| _reset() |
| _currencyDecimalSeparator = newValue |
| } |
| } |
| |
| internal var _usesGroupingSeparator: Bool = false |
| open var usesGroupingSeparator: Bool { |
| get { |
| return _usesGroupingSeparator |
| } |
| set { |
| _reset() |
| _usesGroupingSeparator = newValue |
| } |
| } |
| |
| internal var _groupingSeparator: String! |
| open var groupingSeparator: String! { |
| get { |
| return _groupingSeparator |
| } |
| set { |
| _reset() |
| _groupingSeparator = newValue |
| } |
| } |
| |
| // |
| |
| internal var _zeroSymbol: String? |
| open var zeroSymbol: String? { |
| get { |
| return _zeroSymbol |
| } |
| set { |
| _reset() |
| _zeroSymbol = newValue |
| } |
| } |
| |
| internal var _textAttributesForZero: [String : Any]? |
| open var textAttributesForZero: [String : Any]? { |
| get { |
| return _textAttributesForZero |
| } |
| set { |
| _reset() |
| _textAttributesForZero = newValue |
| } |
| } |
| |
| internal var _nilSymbol: String = "" |
| open var nilSymbol: String { |
| get { |
| return _nilSymbol |
| } |
| set { |
| _reset() |
| _nilSymbol = newValue |
| } |
| } |
| |
| internal var _textAttributesForNil: [String : Any]? |
| open var textAttributesForNil: [String : Any]? { |
| get { |
| return _textAttributesForNil |
| } |
| set { |
| _reset() |
| _textAttributesForNil = newValue |
| } |
| } |
| |
| internal var _notANumberSymbol: String! |
| open var notANumberSymbol: String! { |
| get { |
| return _notANumberSymbol |
| } |
| set { |
| _reset() |
| _notANumberSymbol = newValue |
| } |
| } |
| |
| internal var _textAttributesForNotANumber: [String : Any]? |
| open var textAttributesForNotANumber: [String : Any]? { |
| get { |
| return _textAttributesForNotANumber |
| } |
| set { |
| _reset() |
| _textAttributesForNotANumber = newValue |
| } |
| } |
| |
| internal var _positiveInfinitySymbol: String = "+∞" |
| open var positiveInfinitySymbol: String { |
| get { |
| return _positiveInfinitySymbol |
| } |
| set { |
| _reset() |
| _positiveInfinitySymbol = newValue |
| } |
| } |
| |
| internal var _textAttributesForPositiveInfinity: [String : Any]? |
| open var textAttributesForPositiveInfinity: [String : Any]? { |
| get { |
| return _textAttributesForPositiveInfinity |
| } |
| set { |
| _reset() |
| _textAttributesForPositiveInfinity = newValue |
| } |
| } |
| |
| internal var _negativeInfinitySymbol: String = "-∞" |
| open var negativeInfinitySymbol: String { |
| get { |
| return _negativeInfinitySymbol |
| } |
| set { |
| _reset() |
| _negativeInfinitySymbol = newValue |
| } |
| } |
| |
| internal var _textAttributesForNegativeInfinity: [String : Any]? |
| open var textAttributesForNegativeInfinity: [String : Any]? { |
| get { |
| return _textAttributesForNegativeInfinity |
| } |
| set { |
| _reset() |
| _textAttributesForNegativeInfinity = newValue |
| } |
| } |
| |
| // |
| |
| internal var _positivePrefix: String! |
| open var positivePrefix: String! { |
| get { |
| return _positivePrefix |
| } |
| set { |
| _reset() |
| _positivePrefix = newValue |
| } |
| } |
| |
| internal var _positiveSuffix: String! |
| open var positiveSuffix: String! { |
| get { |
| return _positiveSuffix |
| } |
| set { |
| _reset() |
| _positiveSuffix = newValue |
| } |
| } |
| |
| internal var _negativePrefix: String! |
| open var negativePrefix: String! { |
| get { |
| return _negativePrefix |
| } |
| set { |
| _reset() |
| _negativePrefix = newValue |
| } |
| } |
| |
| internal var _negativeSuffix: String! |
| open var negativeSuffix: String! { |
| get { |
| return _negativeSuffix |
| } |
| set { |
| _reset() |
| _negativeSuffix = newValue |
| } |
| } |
| |
| internal var _currencyCode: String! |
| open var currencyCode: String! { |
| get { |
| return _currencyCode |
| } |
| set { |
| _reset() |
| _currencyCode = newValue |
| } |
| } |
| |
| internal var _currencySymbol: String! |
| open var currencySymbol: String! { |
| get { |
| return _currencySymbol |
| } |
| set { |
| _reset() |
| _currencySymbol = newValue |
| } |
| } |
| |
| internal var _internationalCurrencySymbol: String! |
| open var internationalCurrencySymbol: String! { |
| get { |
| return _internationalCurrencySymbol |
| } |
| set { |
| _reset() |
| _internationalCurrencySymbol = newValue |
| } |
| } |
| |
| internal var _percentSymbol: String! |
| open var percentSymbol: String! { |
| get { |
| return _percentSymbol |
| } |
| set { |
| _reset() |
| _percentSymbol = newValue |
| } |
| } |
| |
| internal var _perMillSymbol: String! |
| open var perMillSymbol: String! { |
| get { |
| return _perMillSymbol |
| } |
| set { |
| _reset() |
| _perMillSymbol = newValue |
| } |
| } |
| |
| internal var _minusSign: String! |
| open var minusSign: String! { |
| get { |
| return _minusSign |
| } |
| set { |
| _reset() |
| _minusSign = newValue |
| } |
| } |
| |
| internal var _plusSign: String! |
| open var plusSign: String! { |
| get { |
| return _plusSign |
| } |
| set { |
| _reset() |
| _plusSign = newValue |
| } |
| } |
| |
| internal var _exponentSymbol: String! |
| open var exponentSymbol: String! { |
| get { |
| return _exponentSymbol |
| } |
| set { |
| _reset() |
| _exponentSymbol = newValue |
| } |
| } |
| |
| // |
| |
| internal var _groupingSize: Int = 3 |
| open var groupingSize: Int { |
| get { |
| return _groupingSize |
| } |
| set { |
| _reset() |
| _groupingSize = newValue |
| } |
| } |
| |
| internal var _secondaryGroupingSize: Int = 0 |
| open var secondaryGroupingSize: Int { |
| get { |
| return _secondaryGroupingSize |
| } |
| set { |
| _reset() |
| _secondaryGroupingSize = newValue |
| } |
| } |
| |
| internal var _multiplier: NSNumber? |
| /*@NSCopying*/ open var multiplier: NSNumber? { |
| get { |
| return _multiplier |
| } |
| set { |
| _reset() |
| _multiplier = newValue |
| } |
| } |
| |
| internal var _formatWidth: Int = 0 |
| open var formatWidth: Int { |
| get { |
| return _formatWidth |
| } |
| set { |
| _reset() |
| _formatWidth = newValue |
| } |
| } |
| |
| internal var _paddingCharacter: String! |
| open var paddingCharacter: String! { |
| get { |
| return _paddingCharacter |
| } |
| set { |
| _reset() |
| _paddingCharacter = newValue |
| } |
| } |
| |
| // |
| |
| internal var _paddingPosition: PadPosition = .beforePrefix |
| open var paddingPosition: PadPosition { |
| get { |
| return _paddingPosition |
| } |
| set { |
| _reset() |
| _paddingPosition = newValue |
| } |
| } |
| |
| internal var _roundingMode: RoundingMode = .halfEven |
| open var roundingMode: RoundingMode { |
| get { |
| return _roundingMode |
| } |
| set { |
| _reset() |
| _roundingMode = newValue |
| } |
| } |
| |
| internal var _roundingIncrement: NSNumber! = 0 |
| /*@NSCopying*/ open var roundingIncrement: NSNumber! { |
| get { |
| return _roundingIncrement |
| } |
| set { |
| _reset() |
| _roundingIncrement = newValue |
| } |
| } |
| |
| internal var _minimumIntegerDigits: Int = 0 |
| open var minimumIntegerDigits: Int { |
| get { |
| return _minimumIntegerDigits |
| } |
| set { |
| _reset() |
| _minimumIntegerDigits = newValue |
| } |
| } |
| |
| internal var _maximumIntegerDigits: Int = 42 |
| open var maximumIntegerDigits: Int { |
| get { |
| return _maximumIntegerDigits |
| } |
| set { |
| _reset() |
| _maximumIntegerDigits = newValue |
| } |
| } |
| |
| internal var _minimumFractionDigits: Int = 0 |
| open var minimumFractionDigits: Int { |
| get { |
| return _minimumFractionDigits |
| } |
| set { |
| _reset() |
| _minimumFractionDigits = newValue |
| } |
| } |
| |
| internal var _maximumFractionDigits: Int = 0 |
| open var maximumFractionDigits: Int { |
| get { |
| return _maximumFractionDigits |
| } |
| set { |
| _reset() |
| _maximumFractionDigits = newValue |
| } |
| } |
| |
| internal var _minimum: NSNumber? |
| /*@NSCopying*/ open var minimum: NSNumber? { |
| get { |
| return _minimum |
| } |
| set { |
| _reset() |
| _minimum = newValue |
| } |
| } |
| |
| internal var _maximum: NSNumber? |
| /*@NSCopying*/ open var maximum: NSNumber? { |
| get { |
| return _maximum |
| } |
| set { |
| _reset() |
| _maximum = newValue |
| } |
| } |
| |
| internal var _currencyGroupingSeparator: String! |
| open var currencyGroupingSeparator: String! { |
| get { |
| return _currencyGroupingSeparator |
| } |
| set { |
| _reset() |
| _currencyGroupingSeparator = newValue |
| } |
| } |
| |
| internal var _lenient: Bool = false |
| open var isLenient: Bool { |
| get { |
| return _lenient |
| } |
| set { |
| _reset() |
| _lenient = newValue |
| } |
| } |
| |
| internal var _usesSignificantDigits: Bool = false |
| open var usesSignificantDigits: Bool { |
| get { |
| return _usesSignificantDigits |
| } |
| set { |
| _reset() |
| _usesSignificantDigits = newValue |
| } |
| } |
| |
| internal var _minimumSignificantDigits: Int = 1 |
| open var minimumSignificantDigits: Int { |
| get { |
| return _minimumSignificantDigits |
| } |
| set { |
| _reset() |
| _usesSignificantDigits = true |
| _minimumSignificantDigits = newValue |
| } |
| } |
| |
| internal var _maximumSignificantDigits: Int = 6 |
| open var maximumSignificantDigits: Int { |
| get { |
| return _maximumSignificantDigits |
| } |
| set { |
| _reset() |
| _usesSignificantDigits = true |
| _maximumSignificantDigits = newValue |
| } |
| } |
| |
| internal var _partialStringValidationEnabled: Bool = false |
| open var isPartialStringValidationEnabled: Bool { |
| get { |
| return _partialStringValidationEnabled |
| } |
| set { |
| _reset() |
| _partialStringValidationEnabled = newValue |
| } |
| } |
| |
| // |
| |
| internal var _hasThousandSeparators: Bool = false |
| open var hasThousandSeparators: Bool { |
| get { |
| return _hasThousandSeparators |
| } |
| set { |
| _reset() |
| _hasThousandSeparators = newValue |
| } |
| } |
| |
| internal var _thousandSeparator: String! |
| open var thousandSeparator: String! { |
| get { |
| return _thousandSeparator |
| } |
| set { |
| _reset() |
| _thousandSeparator = newValue |
| } |
| } |
| |
| // |
| |
| internal var _localizesFormat: Bool = true |
| open var localizesFormat: Bool { |
| get { |
| return _localizesFormat |
| } |
| set { |
| _reset() |
| _localizesFormat = newValue |
| } |
| } |
| |
| // |
| |
| internal var _format: String? |
| open var format: String { |
| get { |
| return _format ?? "#;0;#" |
| } |
| set { |
| _reset() |
| _format = newValue |
| } |
| } |
| |
| // |
| |
| internal var _attributedStringForZero: NSAttributedString = NSAttributedString(string: "0") |
| /*@NSCopying*/ open var attributedStringForZero: NSAttributedString { |
| get { |
| return _attributedStringForZero |
| } |
| set { |
| _reset() |
| _attributedStringForZero = newValue |
| } |
| } |
| |
| internal var _attributedStringForNil: NSAttributedString = NSAttributedString(string: "") |
| /*@NSCopying*/ open var attributedStringForNil: NSAttributedString { |
| get { |
| return _attributedStringForNil |
| } |
| set { |
| _reset() |
| _attributedStringForNil = newValue |
| } |
| } |
| |
| internal var _attributedStringForNotANumber: NSAttributedString = NSAttributedString(string: "NaN") |
| /*@NSCopying*/ open var attributedStringForNotANumber: NSAttributedString { |
| get { |
| return _attributedStringForNotANumber |
| } |
| set { |
| _reset() |
| _attributedStringForNotANumber = newValue |
| } |
| } |
| |
| internal var _roundingBehavior: NSDecimalNumberHandler = NSDecimalNumberHandler.default |
| /*@NSCopying*/ open var roundingBehavior: NSDecimalNumberHandler { |
| get { |
| return _roundingBehavior |
| } |
| set { |
| _reset() |
| _roundingBehavior = newValue |
| } |
| } |
| } |