本文基于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 |
如果單獨處理一種情況,或者兩種情況,我想機智的你,封裝一個工具方法應該不是問題。但是,通常上面的格式都是在NSNumber與String相互轉換,有時可能你需要進位,需要抹零,取整,小數(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)
}
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的,范圍可能不準確。