如何将 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 格式化为这样的字符串? (NSDecimalNumberSKProduct 中价格的存储方式)

【问题讨论】:

你应该使用 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.priceLocaleen_US 并且你在格式化程序上设置了它,他们会看到$2.99 而不是2,99 $US 它将始终使用购买应用程序的区域设置显示。如果我在巴西从美国 AppStore 购买产品,它将显示 $0.99 而不是 R$0,99 @KevinBallard “法语”不是语言环境。您是指fr_FRfr_CAfr_US 或许多其他可能性之一的语言环境吗?语言环境的语言部分对货币值的输出没有实际影响。重要的是区域设置的区域部分。无论哪种方式,产品的priceLocale 都应该适合用户的设备和产品的货币。【参考方案2】:

您可以使用NumberFormatterNSNumber 转换为字符串。

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 单元格标签中

获取以美元为单位的 SKProduct 价格,而不是商店区域设置价格

将 TextField 文本格式化为价格

如何将数字格式化为货币字符串

将十进制值格式化为具有 2 个小数位的货币 [重复]

iOS SKProduct 如何获取IAP的免费试用信息?