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

本文基于Swift3.0.1,Xcode8.1,模擬器英文環(huán)境

Demo

如果你和我一樣,在一家金融公司“搬磚”。在項目中,難免你需要處理很多種數(shù)字格式。
例如:

1234567

格式名 數(shù)字
序數(shù)形式 1,234,567th
貨幣形式 USD1,234,567
會計計數(shù) $1,234,567
科學計數(shù) 1.234567E6
朗讀形式 one million two hundred thirty-four thousand five hundred sixty-seven
貨幣形式 $1,234,567.00
百分數(shù)形式 123,456,700%
貨幣形式 1,234,567.00 US dollars

如果單獨處理一種情況,或者兩種情況,我想機智的你,封裝一個工具方法應該不是問題。但是,通常上面的格式都是在NSNumberString相互轉換,有時可能你需要進位,需要抹零,取整,小數(shù)點后面保留1位小數(shù)點后面保留2位。。。
如果再加上四則運算,我想你肯定有點惱了,當然辦法總是比困難的,也許你之前的處理辦法也很好。但是看完這篇文章之后,我相信你肯定會回去優(yōu)化你之前的方法。

音樂響起,主角出場。。。

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

這是一個枚舉類型的屬性,對一串數(shù)字字符串格式化后的結果就是大概是上面那張表,在Demo中有詳細的內(nèi)容輸出,這里不贅述。

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: 負數(shù)的格式,有點類似時間格式化
     */
    
    // 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: 正數(shù)的格式,有點類似時間格式化
     */
    
    // 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: 是否允許浮點數(shù)
 */

// 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: 確定接收器是否始終顯示小數(shù)分隔符,即使對于整數(shù)也是如此。
     */
    
    // 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: 小數(shù)點替代符
     */
    
    // 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: 數(shù)字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(“不是數(shù)字”)的字符串。 非數(shù)字符號 "NaN"
     */
    
    // open var notANumberSymbol: String!
    
    func notANumberSymbol() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.notANumberSymbol)
    }

關于NaN

textAttributesForNotANumber

    /*
     *  default: nil
     *  desc: ??? 用于顯示NaN(“不是數(shù)字”)字符串的文本屬性。
     */
    
    // 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: 正數(shù)的前綴
     */
    
    // 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: 正數(shù)的后綴
     */
    
    // 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: 負數(shù)的前綴
     */
    
    // 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: 負數(shù)的后綴
     */
    
    // 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 (應該是根據(jù)系統(tǒng)語言變化的)
     *  desc: 貨幣代碼
     */

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

currencySymbol

    /*
     *  default: $(應該會隨系統(tǒng)語言變化)
     *  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: 指數(shù)符號
     */
    
    // open var exponentSymbol: String!
    func exponentSymbol() {
        let formatter = NumberFormatter()
        print(formatter.exponentSymbol)
    } 

groupingSize

    /*
     *  default: 3
     *  desc: 數(shù)字分割的尺寸
     */
    
    // 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決定的尺寸外,其他數(shù)字位分割的尺寸
     */
    
    // 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: 乘數(shù)
     */
    
    // @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: 格式化寬度(字符串所有字符個數(shù))
     */
    
    // 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: 保留到哪位小數(shù)
     */
    
    // @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: 整數(shù)最少位數(shù)
     */
    // 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: 整數(shù)最多位數(shù)
     */
    
    // 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: 小數(shù)最少位數(shù)
     */
    
    // 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 會根據(jù)numberStyle的值變化
     *  desc: 小數(shù)最多位數(shù)
     */
    
    // 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: ??? 接收器允許輸入的最小數(shù)字。
     */
    
    // @NSCopying open var minimum: NSNumber?
    
    func minimum() {
        let formatter = NumberFormatter()
        formatter.numberStyle = NumberFormatter.Style.decimal
        print(formatter.minimum as Any)
    }

maximum

    /*
     *  default: nil
     *  desc: ??? 接收器允許輸入的最大數(shù)字。
     */
    
    // @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: ??? 確定接收器是否將使用啟發(fā)式來猜測字符串意圖的數(shù)字。
     */
    
    // open var isLenient: Bool
    func isLenient() {
        let formatter = NumberFormatter()
        print(formatter.isLenient)
    }

usesSignificantDigits

    /*
     *  default: false
     *  desc: 是否使用有效數(shù)字
     */
    
    // 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: 最小有效數(shù)字位數(shù)
     */
    
    // 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: 最大有效數(shù)字位數(shù)
     */
    
    // 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的,范圍可能不準確。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,300評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 1、隨機數(shù) 不需要隨機數(shù)種子 arc4random()%N + begin:產(chǎn)生begin~begin+N的隨機數(shù)...
    我是小胡胡123閱讀 4,406評論 0 2
  • Hello !親愛的,我是蓉蓉,是一個3歲孩子的寶媽,也是付愛寶的內(nèi)蒙古總代,加入付愛寶一年多的時間,我在呼和浩特...
    rr蓉蓉閱讀 282評論 0 0
  • 文/清心圖/網(wǎng)絡 當愛只剩下傷害的時候,不如放手,成全。 “你知道嗎?他死了?!?金蘭說這話時,我和她剛剛在紀念碑...
    李清心1314閱讀 915評論 6 13

友情鏈接更多精彩內(nèi)容