Swift 之标准数字格式显示

前言:开发中我们常常会遇到金额显示,亦或者显示大数的时候,只是一连串的数字比如: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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值