如何为字符串扩展添加自定义init? [英] How to add custom init for String extension?
本文介绍了如何为字符串扩展添加自定义init?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何为字符串扩展添加自定义init方法?
How can I add custom init method for String extension?
extension String {
init(_ amount: Double, decimalPlaces: UInt) {
self.init()
let decimalFormat = "%0.\(String(decimalPlaces))f"
let currencyAmount = String(format: decimalFormat, amount)
let currencySign = NSLocalizedString("Defaults.CurrencySign", comment: "currency sign")
let formattedString = "\(currencySign)\(currencyAmount)"
// How to set self to `formattedString` ?
}
}
结果,我想看到这样的东西:
As result I want to see something like this:
let price = Double(155.15)
let formattedPrice = String(price, decimalPlaces: 2) // formattedPrice = "$155.15"
已更新:最终解决方案
extension String {
init?(currencyAmount: Double) {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: NSLocalizedString("Defaults.LocaleCurrencyFormat", comment: "currency sign")) // Defaults.LocaleCurrencyFormat equal "es_US" for US
let formattedAmount = formatter.string(from: NSNumber(value: currencyAmount)) ?? ""
self.init(formattedAmount)
}
}
推荐答案
不要自己格式化货币.
无论您怎么认为货币都已格式化,您几乎肯定会 错误 .只是比较一下:
Don't format currencies yourself.
However you might think currencies are formatted, you're almost certainly wrong. Just compare:
- 美国/加拿大:
$3,490,000.89
- 加拿大法语:
3 490 000,89 $
- 法国:
3 490 000,89 €
- 德国:
3.490.000,89 €
- US/Canada:
$3,490,000.89
- French Canadian:
3 490 000,89 $
- France:
3 490 000,89 €
- Germany:
3.490.000,89 €
相反,使用 NumberFormatter
,将numberStyle
设置为.currency
,具有指定的语言环境.
Instead, use NumberFormatter
with numberStyle
set to .currency
, with a specified locale.
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
currencyFormatter.locale = Locale.current
let priceString = currencyFormatter.string(from: 9999.99)!
print(priceString) // Displays $9,999.99 in the US locale
原始答案:
值类型的初始化程序(和变异方法)可以直接直接分配给self
:
import Foundation
extension String {
init(_ amount: Double, decimalPlaces: UInt) {
let currencyAmount = String(format: "%\(decimalPlaces).f", amount)
let currencySign = NSLocalizedString("Defaults.CurrencySign", comment: "currency sign")
self = "\(currencySign)\(currencyAmount)"
}
}
let price = Double(155.15)
let formattedPrice = String(price, decimalPlaces: 2) // formattedPrice = "$155.15"
这篇关于如何为字符串扩展添加自定义init?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文