前言:开发中我们常常会遇到金额显示,亦或者显示大数的时候,只是一连串的数字比如:7877333333,用户看到以后不方便阅读。基于此,一般开发语言都会支持数据的格式化,Swift中NumberFormatter就可以解决我们常见的数据格式化。他会比String.format强大的多。
NumberFormatter
open func string(from number: NSNumber) -> String?
open func number(from string: String) -> NSNumber?
///类方法
@available(iOS 4.0, *)
open class func localizedString(from num: NSNumber, number nstyle: NumberFormatter.Style) -> String
DEMO
let n: NSNumber = 64.01
let formater = NumberFormatter.init()
//formater.numberStyle = .currency
print(formater.string(from: n))
print(formater.number(from: "¥123"))
print(formater.number(from: "123"))
print(NumberFormatter.localizedString(from: n, number: .none)
)
//输出结果:
Optional("64")
nil
Optional(123)
64
NumberFormatter.Style style设置
let n: NSNumber = 64.0192
调用:NumberFormatter.localizedString(from num: NSNumber, number nstyle: NumberFormatter.Style)
结果如下
public enum Style : UInt {
case none //四舍五入的整数 64
//64.019
case decimal //保留三位小数,第四位小数四舍五入
//$64.02
case currency//货币形式-保留2位小数,第三位小数四舍五入
//6,402%
case percent //百分数
case scientific //科学计数:6.40192E1
case spellOut//朗读形式保留连个小数"sixty-four point zero one nine two"
@available(iOS 9.0, *)
case ordinal//序数形式:64th
@available(iOS 9.0, *)
case currencyISOCode//"USD 64.02" 货币编码
@available(iOS 9.0, *)
case currencyPlural//"64.02 US dollars"
@available(iOS 9.0, *)
case currencyAccounting//会计计数 "$64.02"
}
属性最大小数位数 minimumFractionDigits 和maximumFractionDigits
open var minimumFractionDigits: Int//设置小数点后最少几位
open var maximumFractionDigits: Int//设置小数点后最多几位
let number: NSNumber = 12345.6999
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 3 //设置小数点后最多3位
numberFormatter.minimumFractionDigits = 2 //设置小数点后最少2位(不足补0)
//格式化
let format = numberFormatter.string(from: number)!
//打印结果
print("原始值 = \(number)")//12345.6999
print("格式化结果 = \(format)") //12345.700 会舍弃一个后面的零,变为12345.70,因为我们至少有2位的设置,如果不设置minimumFractionDigits,那将会变成:12345.7
设置最大整数位数、最小整数位数(maximumIntegerDigits, minimumIntegerDigits)
let number = NSNumber(value: 655555.6789)
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .currency
numberFormatter.maximumIntegerDigits = 4 //设置最大整数位数(超过的直接截断)
numberFormatter.minimumIntegerDigits = 3 //设置最小整数位数(不足的前面补0)
//格式化
let format = numberFormatter.string(from: number)!
//打印结果
print("格式化结果 = \(format)") $5,555.68 超出的6直接截断
设置前缀、后缀(positivePrefix, positiveSuffix)
//原始值
let number = NSNumber(value: 45.6789)
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .currency //保留两位小数
numberFormatter.positivePrefix = "d$" //自定义前缀,虽然设置啦currency,但是我们是之定义的因此数值的结果是是一样只是前后缀是我们设置的样式
numberFormatter.positiveSuffix = "元" //自定义后缀
//格式化
let format = numberFormatter.string(from: number)!
//打印结果
print("原始值 = \(number)")//45.6789
print("格式化结果 = \(format)")//d$12,345.68元
设置格式化字符串:positiveFormat 和 negativeFormat
default:暂未符:#
货币符号用:¤
numberFormatter.positiveFormat = "###,###.##" //设置格式
设置格式宽度、填充符、填充位置
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .decimal //保留小数点三位
numberFormatter.formatWidth = 15 //补齐15位
numberFormatter.paddingCharacter = "-" //不足位数用-补
numberFormatter.paddingPosition = .beforePrefix //补在前面
//格式化
let format = numberFormatter.string(from: number)!
print("格式化结果 = \(format)")
//源码paddingPosition集中类型
public enum PadPosition : UInt {
case beforePrefix //-----12,345.679 补在前面
case afterPrefix //-----12,345.679 补在前面
case beforeSuffix//12,345.679----- 后面
case afterSuffix//12,345.679----- 后面
}
上述的那些属性已经可以基本满足我们开发中的各个需求,还有一些其他相关属性,有兴趣的可以自己看看,尝试一下。
open class NumberFormatter : Formatter {
@available(iOS 8.0, *)
open var formattingContext: Formatter.Context
open func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, range rangep: UnsafeMutablePointer<NSRange>?) throws
open func string(from number: NSNumber) -> String?
open func number(from string: String) -> NSNumber?
@available(iOS 4.0, *)
open class func localizedString(from num: NSNumber, number nstyle: NumberFormatter.Style) -> String
open class func defaultFormatterBehavior() -> NumberFormatter.Behavior
open class func setDefaultFormatterBehavior(_ behavior: NumberFormatter.Behavior)
open var numberStyle: NumberFormatter.Style
open var locale: Locale!
open var generatesDecimalNumbers: Bool
open var formatterBehavior: NumberFormatter.Behavior
open var negativeFormat: String!
open var textAttributesForNegativeValues: [String : Any]?
open var positiveFormat: String!
open var textAttributesForPositiveValues: [String : Any]?
open var allowsFloats: Bool
open var decimalSeparator: String!
open var alwaysShowsDecimalSeparator: Bool
open var currencyDecimalSeparator: String!
open var usesGroupingSeparator: Bool
open var groupingSeparator: String!
open var zeroSymbol: String?
open var textAttributesForZero: [String : Any]?
open var nilSymbol: String
open var textAttributesForNil: [String : Any]?
open var notANumberSymbol: String!
open var textAttributesForNotANumber: [String : Any]?
open var positiveInfinitySymbol: String
open var textAttributesForPositiveInfinity: [String : Any]?
open var negativeInfinitySymbol: String
open var textAttributesForNegativeInfinity: [String : Any]?
open var positivePrefix: String!
open var positiveSuffix: String!
open var negativePrefix: String!
open var negativeSuffix: String!
open var currencyCode: String!
open var currencySymbol: String!
open var internationalCurrencySymbol: String!
open var percentSymbol: String!
open var perMillSymbol: String!
open var minusSign: String!
open var plusSign: String!
open var exponentSymbol: String!
open var groupingSize: Int
open var secondaryGroupingSize: Int
@NSCopying open var multiplier: NSNumber?
open var formatWidth: Int
open var paddingCharacter: String!
open var paddingPosition: NumberFormatter.PadPosition
open var roundingMode: NumberFormatter.RoundingMode
@NSCopying open var roundingIncrement: NSNumber!
open var minimumIntegerDigits: Int
open var maximumIntegerDigits: Int
open var minimumFractionDigits: Int
open var maximumFractionDigits: Int
@NSCopying open var minimum: NSNumber?
@NSCopying open var maximum: NSNumber?
@available(iOS 2.0, *)
open var currencyGroupingSeparator: String!
@available(iOS 2.0, *)
open var isLenient: Bool
@available(iOS 2.0, *)
open var usesSignificantDigits: Bool
@available(iOS 2.0, *)
open var minimumSignificantDigits: Int
@available(iOS 2.0, *)
open var maximumSignificantDigits: Int
@available(iOS 2.0, *)
open var isPartialStringValidationEnabled: Bool
}