如何将 SKProduct 价格格式化为 Swift 货币字符串?
Posted
技术标签:
【中文标题】如何将 SKProduct 价格格式化为 Swift 货币字符串?【英文标题】:How can I format a SKProduct price into a Swift currency string? 【发布时间】:2017-10-03 22:22:22 【问题描述】:如果你有这样的代码,那么p
将是"2.99"
:
let price = 2.99
let p = String(format: "%.2f", price)
但是,如果你有这样的代码:
let priceNS: NSDecimalNumber = 2.99
let p2 = String(format: "%.2f", priceNS)
那么p2
就是"0.00"
。
如何将NSDecimalNumber
格式化为这样的字符串? (NSDecimalNumber
是 SKProduct
中价格的存储方式)
【问题讨论】:
你应该使用Decimal
而不是 Swift 中的 NSDecimalNumber
。
@Alexander 它来自 Apple StoreKit API 价格属性
@LeoDabus 他们已经搭上桥梁
@Alexander 这对代码有什么帮助,例如:String(format: "%.2f", someSKProduct.price)
@Sausagedioxide 它没有,但它通过删除潜在的共享可变状态在其他情况下有所帮助
【参考方案1】:
您应该使用 NumberFormatter 格式化您的产品价格并使用您的产品区域设置:https://developer.apple.com/documentation/storekit/skproduct/1506094-price
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.locale = someSKProduct.priceLocale
let formattedPrice = numberFormatter.string(from: someSKProduct.price) ?? ""
【讨论】:
SKProduct
真的包含“价格区域设置”而不是货币代码?这很奇怪。产品不应该确定是否例如我使用.
或,
作为小数点分隔符。
@KevinBallard 考虑到用户不需要输入任何价格,我认为这不是问题。
影响显示,不影响输入。如果用户将他们的设备设置为法语,并且以美元购买东西,它应该显示为例如2,99 $US
。但是如果product.priceLocale
是en_US
并且你在格式化程序上设置了它,他们会看到$2.99
而不是2,99 $US
。
它将始终使用购买应用程序的区域设置显示。如果我在巴西从美国 AppStore 购买产品,它将显示 $0.99
而不是 R$0,99
@KevinBallard “法语”不是语言环境。您是指fr_FR
、fr_CA
、fr_US
或许多其他可能性之一的语言环境吗?语言环境的语言部分对货币值的输出没有实际影响。重要的是区域设置的区域部分。无论哪种方式,产品的priceLocale
都应该适合用户的设备和产品的货币。【参考方案2】:
您可以使用NumberFormatter
将NSNumber
转换为字符串。
let priceNS:NSDecimalNumber = 2.99
let nf = NumberFormatter()
nf.maximumFractionDigits = 2
nf.string(from: priceNS) //2.99
【讨论】:
仅当您希望显示货币符号(例如$
)时才适合使用.currency
样式。如果您这样做,请保留区域设置并改为设置 currencyCode
属性。
取决于价格的显示方式。也许 OP 已经在用户知道货币的上下文中显示它?
无论如何,为了扩展我之前的评论,语言环境会影响格式,currencyCode
会影响实际货币。不要设置区域设置只是为了强制使用美元,这将无法正常工作。除了格式差异之外,这将使其显示为例如$2.99
在加拿大应该显示为 US$2.99
。如果您不考虑区域设置并设置nf.currencyCode = "USD"
,那么无论用户区域设置如何,您都将获得正确的货币显示。以上是关于如何将 SKProduct 价格格式化为 Swift 货币字符串?的主要内容,如果未能解决你的问题,请参考以下文章
将 SKProduct 价格提取到 UICollectionView 单元格标签中