【问题标题】:How to format Decimal in Swift 3如何在 Swift 3 中格式化小数
【发布时间】:2017-09-08 00:49:11
【问题描述】:

我正在尝试使用 Swift Decimal 结构进行货币操作,但我无法对其进行格式化。

如何格式化var myDecimal:Decimal = 9999.99 以显示 $9,999.99?

不使用Decimals 我可以按如下方式进行...

let myTotal:NSNumber = 9999.99

let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true

currencyFormatter.numberStyle = .currency
currencyFormatter.locale = NSLocale.current
let priceString = currencyFormatter.string(from: myTotal)

myLabel.text = priceString

这很好用,但我一直在阅读,Decimal似乎是正确的货币类型。

我试过了……

let myTotal:Decimal = 9999.99

let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true

currencyFormatter.numberStyle = .currency
// localize to your grouping and decimal separator
currencyFormatter.locale = NSLocale.current
let priceString = currencyFormatter.string(from: NSNumber(myTotal))

myLabel.text = priceString

...但我得到错误

参数标签“(_:)”不匹配任何可用的重载

在 Swift 中格式化Decimals 的正确方法是什么?

【问题讨论】:

标签: swift decimal numberformatter


【解决方案1】:

您可以先将 Decimal 转换为 NSDecimalNumber

let priceString = currencyFormatter.string(from: myTotal as NSDecimalNumber)

【讨论】:

  • string(from:) 更具体,因为它采用数字类型作为参数,而不是 Any
  • NSDecimalNumber NSNumber 类型。
  • string(for:) 是抽象 Formatter 超类的方法。它是适用于任何 Formatter 子类的非特定 API,文档没有说明它在 NumberFormatter 实例上使用时的作用。 string(from:) 实际上是在 NumberFormatter 文档中提到的,它的作用实际上是记录在案的。因此,我更喜欢它。在实践中,这可能并不重要,因为很可能这些方法中的一种可能只是调用另一种。
  • 他们使用Any,因为该方法在抽象超类Formatter上,因此不知道它将采用什么类型的对象,甚至不知道它是数字格式化程序还是日期格式化程序,人名格式化程序,一些疯狂的自定义格式化程序,或其他东西。他们实际上确实DoubleFloatDecimal 的每种类型添加了一个方法,在某种意义上,因为他们为NSNumber 添加了一个方法,这是Objective-C 类型所有这些类型都连接到。
猜你喜欢
  • 1970-01-01
  • 2019-12-28
  • 2017-05-24
  • 2018-07-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多