iOS中一个很重要,但是不熟悉的类NumberFormatter(上)

本文基于Swift3.0.1,Xcode8.1,模拟器英文环境

Demo

如果你和我一样,在一家金融公司“搬砖”。在项目中,难免你需要处理很多种数字格式。
例如:

1234567

格式名 数字
序数形式 1,234,567th
货币形式 USD1,234,567
会计计数 $1,234,567
科学计数 1.234567E6
朗读形式 one million two hundred thirty-four thousand five hundred sixty-seven
货币形式 $1,234,567.00
百分数形式 123,456,700%
货币形式 1,234,567.00 US dollars

如果单独处理一种情况,或者两种情况,我想机智的你,封装一个工具方法应该不是问题。但是,通常上面的格式都是在NSNumberString相互转换,有时可能你需要进位,需要抹零,取整,小数点后面保留1位小数点后面保留2位。。。
如果再加上四则运算,我想你肯定有点恼了,当然办法总是比困难的,也许你之前的处理办法也很好。但是看完这篇文章之后,我相信你肯定会回去优化你之前的方法。

音乐响起,主角出场。。。

NumberFormatter(NSNumberFormatter)

numberStyle

          NumberFormatter.Style.none,
          NumberFormatter.Style.decimal,
          NumberFormatter.Style.currency,
          NumberFormatter.Style.percent,
          NumberFormatter.Style.scientific,
          NumberFormatter.Style.spellOut,
          NumberFormatter.Style.ordinal, 
          NumberFormatter.Style.currencyISOCode,
          NumberFormatter.Style.currencyPlural,  
          NumberFormatter.Style.currencyAccounting

这是一个枚举类型的属性,对一串数字字符串格式化后的结果就是大概是上面那张表,在Demo中有详细的内容输出,这里不赘述。

locale

        let formatter = NumberFormatter()
        print(formatter.locale)  // en_US (current)
        formatter.locale = Locale(identifier: "fr_FR")
        print(formatter.currencySymbol) // €
        formatter.locale = Locale(identifier: "en_US")
        print(formatter.currencySymbol) // $

这个属性的主要作用是决定货币符号,货币代码货币阅读方式输出

generatesDecimalNumbers

    /*
     * default: false
     * desc:  控制这个func number(from string: String) -> NSNumber?的返回值是
     *        false是NSNumber
     *        true是NSDecimalNumber
     */
    
    // open var generatesDecimalNumbers: Bool
    func generatesDecimalNumbers() {
        let numberFormatter = NumberFormatter()
        numberFormatter.generatesDecimalNumbers = true
        let str = numberFormatter.number(from: "1234.56878")
        if str!.isMember(of: NSNumber.self) {
            print("number")
        } else if str!.isMember(of: NSDecimalNumber.self) {
            print("DecimalNumber")
        }
    }

formatterBehavior

   /*
     *  default: Behavior
     *  desc: ??? 接收器的格式化器行为。
     */
    
    // open var formatterBehavior: NumberFormatter.Behavior
    func formatterBehavior() {
        let formatter = NumberFormatter()
        print(formatter.formatterBehavior)
    }

这个属性我没有找到相关的资料,凡是有这个???记号的都是我不知道具体用法的。

negativeFormat

    /*
     *  default: #
     *  desc: 负数的格式,有点类似时间格式化
     */
    
    // open var negativeFormat: String!
    func negativeFormat() {
        let formatter = NumberFormatter()
        print(formatter.negativeFormat)
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.string(from: -70.00)!) // -$70.00
        formatter.negativeFormat = "¤-#,##0.00"
        print(formatter.string(from: -70.00)!) //$-70.00
    }

textAttributesForNegativeValues

    /*
     *  default: nil
     *  desc: ???  用于显示负值的文本属性。
     */
    
    // open var textAttributesForNegativeValues: [String : Any]?
    func textAttributesForNegativeValues() {
        let formatter = NumberFormatter()
        print(formatter.textAttributesForNegativeValues as Any)
    }

positiveFormat

    /*
     *  default: #
     *  desc: 正数的格式,有点类似时间格式化
     */
    
    // open var positiveFormat: String!
    func positiveFormat() {
        let formatter = NumberFormatter()
        print(formatter.positiveFormat)
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.string(from: 70.00)!) // $70.00
        formatter.positiveFormat = "+¤#,##0.00"
        print(formatter.string(from: 70.00)!) //+$70.00
    }

textAttributesForPositiveValues

    /*
     *  default: nil
     *  desc: ??? 用于显示正值的文本属性。
     */
    
    // open var textAttributesForPositiveValues: [String : Any]?
    func textAttributesForPositiveValues() {
        let formatter = NumberFormatter()
        print(formatter.textAttributesForPositiveValues as Any)
    }

allowsFloats

/* 
 *  default: true
 *  desc: 是否允许浮点数
 */

// open var allowsFloats: Bool
func allowsFloats() {
    let formatter = NumberFormatter()
    let str = formatter.number(from: "1237868794.56878")
    print(str!) // 1237868794.56878
    formatter.allowsFloats = false
    let str1 = formatter.number(from: "1237868794.56878")
    print(str1 as Any) // nil
}

decimalSeparator

func decimalSeparator() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.decimalSeparator)
        formatter.decimalSeparator = ","
        let str = formatter.number(from: "1237868,79456878")
        print(str!) // 1237868.79456878
    }

alwaysShowsDecimalSeparator

    /*
     *  default: false
     *  desc: 确定接收器是否始终显示小数分隔符,即使对于整数也是如此。
     */
    
    // open var alwaysShowsDecimalSeparator: Bool
    func alwaysShowsDecimalSeparator() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.alwaysShowsDecimalSeparator)
        formatter.alwaysShowsDecimalSeparator = true
        let str = formatter.string(from: 14321423)
        print(str!) // 14,321,423.
    }

currencyDecimalSeparator

    /*
     *  default: '.'
     *  desc: 小数点替代符
     */
    
    // open var currencyDecimalSeparator: String!
    func currencyDecimalSeparator() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.currencyDecimalSeparator)
        let str = formatter.string(from: 14321423.123)
        print(str!) //  $14,321,423.12
        formatter.currencyDecimalSeparator = "_"
        let str1 = formatter.string(from: 14321423.123)
        print(str1!) // $14,321,423_12
    }

usesGroupingSeparator

    /*
     *  default: true
     *  desc: 是否使用分隔符
     */
    
    // open var usesGroupingSeparator: Bool
    func usesGroupingSeparator() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.usesGroupingSeparator)
        let str = formatter.string(from: 14321423.123)
        print(str!) //  $14,321,423.12
        formatter.usesGroupingSeparator = false
        let str1 = formatter.string(from: 14321423.123)
        print(str1!) // $14321423.12
    }

groupingSeparator

    /*
     *  default: ','
     *  desc:  NumberFormatter.Style.decimal 的分隔符
     */
    
    // open var groupingSeparator: String!
    func groupingSeparator() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.groupingSeparator)
        let str = formatter.string(from: 14321423.123)
        print(str!) //  $14,321,423.123
        formatter.groupingSeparator = "*"
        let str1 = formatter.string(from: 14321423.123)
        print(str1!) // $14*321*423.123
    }

zeroSymbol

    /*
     *  default: nil
     *  desc: 数字0的替换符号
     */
    
    // open var zeroSymbol: String?
    func zeroSymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.zeroSymbol as Any)
        let str = formatter.string(from: 0)
        print(str!) //  0
        formatter.zeroSymbol = "*"
        let str1 = formatter.string(from: 0)
        print(str1!) // *
    }

textAttributesForZero

    /*
     *  default: nil
     *  desc: ??? 接收器用于显示零值的属性字符串。
     */
    
    // open var textAttributesForZero: [String : Any]?
    func textAttributesForZero() {
        let formatter = NumberFormatter()
        print(formatter.textAttributesForZero as Any)
    }

nilSymbol

    /*
     *  default: nil
     *  desc: ??? 接收器用来表示空值的字符串。
     */
    
    // open var nilSymbol: String
    func nilSymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.nilSymbol)
        formatter.nilSymbol = ">"
        let str = formatter.number(from: "--")
        print(str as Any)
    }

textAttributesForNil

/*
 *  default: nil
 *  desc: ??? 用于显示nil符号的文本属性。
 */

// open var textAttributesForNil: [String : Any]?
func textAttributesForNil() {
    
    let formatter = NumberFormatter()
    formatter.numberStyle = NumberFormatter.Style.decimal
    print(formatter.textAttributesForNil as Any)
}

notANumberSymbol

    /*
     *  default: NaN
     *  desc: ??? 接收器用来表示NaN(“不是数字”)的字符串。 非数字符号 "NaN"
     */
    
    // open var notANumberSymbol: String!
    
    func notANumberSymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.notANumberSymbol)
    }

关于NaN

textAttributesForNotANumber

    /*
     *  default: nil
     *  desc: ??? 用于显示NaN(“不是数字”)字符串的文本属性。
     */
    
    // open var textAttributesForNotANumber: [String : Any]?
    
    func textAttributesForNotANumber() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.textAttributesForNotANumber as Any)
    }

positiveInfinitySymbol

    /*
     *  default: +∞
     *  desc: 正无穷符号
     */
    
    // open var positiveInfinitySymbol: String
    func positiveInfinitySymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.positiveInfinitySymbol)
    }

textAttributesForPositiveInfinity

    /*
     *  default: nil
     *  desc: ??? 用于显示正无穷大符号的文本属性。
     */
    
    // open var textAttributesForPositiveInfinity: [String : Any]?
    func textAttributesForPositiveInfinity() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.textAttributesForPositiveInfinity as Any)
    }

negativeInfinitySymbol

    /*
     *  default: -∞
     *  desc: 负无穷
     */
    
    // open var negativeInfinitySymbol: String
    func negativeInfinitySymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.negativeInfinitySymbol)
    }

textAttributesForNegativeInfinity

    /*
     *  default: nil
     *  desc: ??? 用于显示负无穷大符号的文本属性。
     */
    
    // open var textAttributesForNegativeInfinity: [String : Any]?
    func textAttributesForNegativeInfinity() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.textAttributesForNegativeInfinity as Any)
    }

positivePrefix

    /*
     *  default: ''
     *  desc: 正数的前缀
     */
    
    // open var positivePrefix: String!
    
    func positivePrefix() {
        let formatter = NumberFormatter()
        print(formatter.positivePrefix, "")
        let str = formatter.string(from: 123456)
        print(str as Any)
        formatter.positivePrefix = "+" // 123456
        let str1 = formatter.string(from: 123456) // +123456
        print(str1 as Any)
    }

positiveSuffix

    /*
     *  default: ''
     *  desc: 正数的后缀
     */
    
    // open var positiveSuffix: String!
    func positiveSuffix() {
        let formatter = NumberFormatter()
        print(formatter.positiveSuffix, "")
        let str = formatter.string(from: 123456)
        print(str as Any) // "123456"
        formatter.positiveSuffix = ""
        let str1 = formatter.string(from: 123456)
        print(str1 as Any) // "123456"
    }

negativePrefix

    /*
     *  default: '-'
     *  desc: 负数的前缀
     */
    
    // open var negativePrefix: String!
    func negativePrefix() {
        let formatter = NumberFormatter()
        print(formatter.negativePrefix, "")
        let str = formatter.string(from: -123456)
        print(str as Any) // -123456
        formatter.negativePrefix = "减号"
        let str1 = formatter.string(from: -123456) // 减号123456
        print(str1 as Any)
    }

negativeSuffix

    /*
     *  default: '-'
     *  desc: 负数的后缀
     */
    
    // open var negativeSuffix: String!
    func negativeSuffix() {
        let formatter = NumberFormatter()
        print(formatter.negativeSuffix, "")
        let str = formatter.string(from: -123456)
        print(str as Any) // "-123456"
        formatter.negativeSuffix = ""
        let str1 = formatter.string(from: -123456) // "-123456"
        print(str1 as Any) //
    }

currencyCode

    /*
     *  default: USD (应该是根据系统语言变化的)
     *  desc: 货币代码
     */

    // open var currencyCode: String!
    func currencyCode() {
        let formatter = NumberFormatter()
        print(formatter.currencyCode)
    }

currencySymbol

    /*
     *  default: $(应该会随系统语言变化)
     *  desc: 货币符号
     */
    
    // open var currencySymbol: String!
    func currencySymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.currencySymbol)
        let str = formatter.string(from: 123456) 
        print(str as Any) // $123,456.00
        formatter.currencySymbol = ""
        let str1 = formatter.string(from: 123456) 
        print(str1 as Any) // 123,456.00
    }

internationalCurrencySymbol

    /*
     *  default: USD (会随语言变化而变化,设置locale也会变化)
     *  desc:
     */
    
    // open var internationalCurrencySymbol: String!
    func internationalCurrencySymbol() {
        let formatter = NumberFormatter()
        //        formatter.locale = Locale(identifier: "de_DE")
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.internationalCurrencySymbol)
        let str = formatter.string(from: 123456)
        print(str as Any)
        let str1 = formatter.string(from: 123456)
        print(str1 as Any)
    }

percentSymbol

    /*
     *  default: %
     *  desc: 百分号,可以自定义
     */
    
    // open var percentSymbol: String!
    func percentSymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.percent
        print(formatter.percentSymbol)
        let str = formatter.string(from: 123456) // 12,345,600%
        print(str as Any)
        formatter.percentSymbol = ""
        let str1 = formatter.string(from: 123456) // 12,345,600
        print(str1 as Any)
    }

perMillSymbol

    /*
     *  default: ‰
     *  desc: 千分号
     */
    
    // open var perMillSymbol: String!
    func perMillSymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.percent
        print(formatter.perMillSymbol)
    }

minusSign

    /*
     *  default: -
     *  desc: 减号
     */
    
    //  open var minusSign: String!
    func minusSign() {
        let formatter = NumberFormatter()
        print(formatter.minusSign)
    }

plusSign

    /*
     *  default: +
     *  desc: 加号
     */
    
    // open var plusSign: String!
    func plusSign() {
        let formatter = NumberFormatter()
        print(formatter.plusSign)
    }

exponentSymbol

    /*
     *  default: E
     *  desc: 指数符号
     */
    
    // open var exponentSymbol: String!
    func exponentSymbol() {
        let formatter = NumberFormatter()
        print(formatter.exponentSymbol)
    } 

groupingSize

    /*
     *  default: 3
     *  desc: 数字分割的尺寸
     */
    
    // open var groupingSize: Int
    func groupingSize() {
        
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.groupingSize)
        let str = formatter.string(from: 123456) // $123,456.00
        print(str as Any)
        formatter.groupingSize = 1
        let str1 = formatter.string(from: 123456) // $1,2,3,4,5,6.00
        print(str1 as Any)
    }

secondaryGroupingSize

    /*
     *  default: 0
     *  desc: 除了groupingSize决定的尺寸外,其他数字位分割的尺寸
     */
    
    // open var secondaryGroupingSize: Int
    func secondaryGroupingSize() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.secondaryGroupingSize)
        let str = formatter.string(from: 123456) // $123,456.00
        print(str as Any)
        formatter.secondaryGroupingSize = 1
        let str1 = formatter.string(from: 123456) // $1,2,3,456.00
        print(str1 as Any)
    }

multiplier

    /*
     *  default: nil
     *  desc: 乘数
     */
    
    // @NSCopying open var multiplier: NSNumber?
    func multiplier() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.multiplier as Any)
        let str = formatter.string(from: 123456) // $123,456.00
        print(str as Any)
        formatter.multiplier = 10
        let str1 = formatter.string(from: 123456) // $1,234,560.00
        print(str1 as Any)
    }

formatWidth

    /*
     *  default: 0
     *  desc: 格式化宽度(字符串所有字符个数)
     */
    
    // open var formatWidth: Int
    func formatWidth() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.formatWidth)
        let str = formatter.string(from: 123456) // "$123,456.00"
        print(str as Any)
        formatter.formatWidth = 15
        let str1 = formatter.string(from: 123456) // "    $123,456.00"
        print(str1 as Any)
    }

paddingCharacter

    /*
     *  default: ''
     *  desc: 填充符号
     */
    
    // open var paddingCharacter: String!
    
    func paddingCharacter() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.paddingCharacter)
        let str = formatter.string(from: 123456) // "$123,456.00"
        print(str as Any)
        formatter.formatWidth = 15
        formatter.paddingCharacter = "*"
        let str1 = formatter.string(from: 123456) // "****$123,456.00"
        print(str1 as Any)
    }

beforePrefix

    /*
     *  default: beforePrefix
     *  desc: 填充方向
     */
    
    // open var paddingPosition: NumberFormatter.PadPosition
    func paddingPosition() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.paddingPosition == .beforePrefix)
        formatter.formatWidth = 15
        formatter.paddingCharacter = "*"
        let str = formatter.string(from: 123456) // "****$123,456.00"
        print(str as Any)
        formatter.paddingPosition = NumberFormatter.PadPosition.afterPrefix
        let str1 = formatter.string(from: 123456) // "$****123,456.00"
        print(str1 as Any)
    }

roundingMode

    /*
     *  default: halfEven
     *  desc: 舍入方式
     */
    
    // open var roundingMode: NumberFormatter.RoundingMode
    func roundingMode() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.roundingMode == .halfEven)
        let str = formatter.string(from: 123456.1235) // "123,456.124"
        print(str as Any)
        formatter.roundingMode = .halfDown
        let str1 = formatter.string(from: 123456.1235) // "123,456.123"
        print(str1 as Any)
    }

roundingIncrement

    /*
     *  default: 0
     *  desc: 保留到哪位小数
     */
    
    // @NSCopying open var roundingIncrement: NSNumber!
    func roundingIncrement() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.roundingIncrement)
        let str = formatter.string(from: 123456.1235) // "123,456.124"
        print(str as Any)
        formatter.roundingIncrement = 0.1
        let str1 = formatter.string(from: 123456.1235) // "123,456.1"
        print(str1 as Any)
    }

minimumIntegerDigits

    /*
     *  default: 1
     *  desc: 整数最少位数
     */
    // open var minimumIntegerDigits: Int
    func minimumIntegerDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.minimumIntegerDigits)
        let str = formatter.string(from: 123456.1235) // "123,456.124"
        print(str as Any)
        formatter.minimumIntegerDigits = 10
        let str1 = formatter.string(from: 123456.1235) // "0,000,123,456.124"
        print(str1 as Any)
    }

maximumIntegerDigits

    /*
     *  default: 2000000000
     *  desc: 整数最多位数
     */
    
    // open var maximumIntegerDigits: Int
    func maximumIntegerDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.maximumIntegerDigits)
        let str = formatter.string(from: 123456.1235) // "123,456.124"
        print(str as Any)
        formatter.maximumIntegerDigits = 1
        let str1 = formatter.string(from: 123456.1235) // "6.124"
        print(str1 as Any)
    }

minimumFractionDigits

    /*
     *  default: 0
     *  desc: 小数最少位数
     */
    
    // open var minimumFractionDigits: Int
    func minimumFractionDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.minimumFractionDigits)
        let str = formatter.string(from: 123456.1235) // "123,456.124"
        print(str as Any)
        formatter.minimumFractionDigits = 10
        let str1 = formatter.string(from: 123456.1235) // "123,456.1235000000"
        print(str1 as Any)
    }

maximumFractionDigits

    /*
     *  default: 3 会根据numberStyle的值变化
     *  desc: 小数最多位数
     */
    
    // open var maximumFractionDigits: Int
    func maximumFractionDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.maximumFractionDigits)
        let str = formatter.string(from: 123456.1235) // "123,456.124"
        print(str as Any)
        formatter.maximumFractionDigits = 1
        let str1 = formatter.string(from: 123456.1235) // "123,456.1"
        print(str1 as Any)
    }

minimum

    /*
     *  default: nil
     *  desc: ??? 接收器允许输入的最小数字。
     */
    
    // @NSCopying open var minimum: NSNumber?
    
    func minimum() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.minimum as Any)
    }

maximum

    /*
     *  default: nil
     *  desc: ??? 接收器允许输入的最大数字。
     */
    
    // @NSCopying open var maximum: NSNumber?
    func maximum() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.maximum as Any)
    }

currencyGroupingSeparator

    /*
     *  default: ','
     *  desc: 货币格式分隔符
     */
    
    // open var currencyGroupingSeparator: String!
    func currencyGroupingSeparator() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.currencyGroupingSeparator as Any)
        let str = formatter.string(from: 123456.1235) // "$123,456.12"
        print(str as Any)
        formatter.currencyGroupingSeparator = "*"
        let str1 = formatter.string(from: 123456.1235) // "$123*456.12"
        print(str1 as Any)
    }

isLenient

    /*
     *  default: false
     *  desc: ??? 确定接收器是否将使用启发式来猜测字符串意图的数字。
     */
    
    // open var isLenient: Bool
    func isLenient() {
        let formatter = NumberFormatter()
        print(formatter.isLenient)
    }

usesSignificantDigits

    /*
     *  default: false
     *  desc: 是否使用有效数字
     */
    
    // open var usesSignificantDigits: Bool
    func usesSignificantDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.usesSignificantDigits)
        let str = formatter.string(from: 123456.1235) // "$123,456.12"
        print(str as Any)
        formatter.usesSignificantDigits = true
        let str1 = formatter.string(from: 123456.1235) // "$123,456"
        print(str1 as Any)
    }

minimumSignificantDigits

    /*
     *  default: 1
     *  desc: 最小有效数字位数
     */
    
    // open var minimumSignificantDigits: Int
    func minimumSignificantDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.minimumSignificantDigits)
        let str = formatter.string(from: 123456.1235) // "$123,456.12"
        print(str as Any)
        formatter.minimumSignificantDigits = 10
        let str1 = formatter.string(from: 123456.1235) // "$123,456.1235"
        print(str1 as Any)
    }

maximumSignificantDigits

    /*
     *  default: 6
     *  desc: 最大有效数字位数
     */
    
    // open var maximumSignificantDigits: Int
    func maximumSignificantDigits() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        print(formatter.maximumSignificantDigits)
        let str = formatter.string(from: 123456.1235) // "$123,456.12"
        print(str as Any)
        formatter.maximumSignificantDigits = 2
        let str1 = formatter.string(from: 123456.1235) // "$120,000"
        print(str1 as Any)
        formatter.maximumSignificantDigits = 3
        let str2 = formatter.string(from: 123456.1235) // "$123,000"
        print(str2 as Any)
    }

isPartialStringValidationEnabled

    /*
     *  default: false
     *  desc: ??? 确定是否为接收器启用部分字符串验证。
     */
    
    // open var isPartialStringValidationEnabled: Bool
    func isPartialStringValidationEnabled() {
        let formatter = NumberFormatter()
        print(formatter.isPartialStringValidationEnabled)
    }

使用
func number(from string: String) -> NSNumber?

func string(from number: NSNumber) -> String?
需要注意的问题

        let n: NSNumber = 12345.65748
        let formatter = NumberFormatter()
        
        print(formatter.number(from: n.description) as Any) // 12345.65748
        print(formatter.string(from: n) as Any) // 12346
        let n: NSNumber = 12345.65748
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.number(from: n.description) as Any) // 12345.65748
        print(formatter.string(from: n) as Any) // 12,345.657

暂且先不讨论分割符“,”就精度而言,肯定选择前者,但是特殊格式有要求需要就选后者。但是这种情况请注意

        let n: NSNumber = 12345.65748
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.currency
        //  formatter.currencySymbol = "" 
        print(formatter.number(from: n.description) as Any) // nil
        print(formatter.string(from: n) as Any) // $12,345.66

这是怎么回事?
n.description改成formatter.currencySymbol + n.description试试。
或者放开注释那句,那么最后那个也没有了货币符号。

不知道你有没有注意我使用了description这个属性,
在NSNumber有一点小小的bug

从64.01开始,NSNumber(value: 64.01).description得到是这样
64.01000000000001”到“99.01”都是有bug的,范围可能不准确。

你可能感兴趣的:(iOS中一个很重要,但是不熟悉的类NumberFormatter(上))