2017-02-28 66 views
2

如何为字符串扩展添加自定义的init方法?如何为字符串扩展添加自定义初始化?

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` ? 
    } 
} 

至于结果,我希望看到这样的事情:

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) 
    } 
} 
+2

“*如何将自己设置为'formattedString' *?”你通常如何执行任务? (*提示提示*) – Hamish

+0

@Hamish足够有趣,第一次我需要它时,一点都不会发生。从我的Java背景中,我被迫陷入了一个非常特殊的误导思维。 – Alexander

+0

Hamish,感谢提示:D –

回答

2

值类型的初始化(和变异方法)可以简单地分配直接到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" 
+0

非常明显))谢谢,将标记为正确5分钟后回答。 –

+1

在字符串内插中使用字符串初始值设定项是多余的 –

+0

@LeoDabus我刚刚复制了原始代码,没有注意到。固定。 – Alexander

相关问题