如何为字符串扩展添加自定义init? [英] How to add custom init for String extension?

查看:56
本文介绍了如何为字符串扩展添加自定义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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆