2017-12-31 58 views
0

-24.5などのDouble値を-$24.50のような通貨形式の文字列に書式化したいとします。スウィフトではどうすればいいですか?Swiftの通貨に負のDoubleを書式設定する

私はthis postに続きますが、それは$-24.50($の後にマイナス記号が付いています)というフォーマットになります。これは私が望むものではありません。

これを達成するためのより洗練されたソリューションがありますか?使用NumberFormatter

if value < 0 { 
    return String(format: "-$%.02f", -value) 
} else { 
    return String(format: "$%.02f", value) 
} 
+3

てNumberFormatter。 Swiftの一般的な 'String(format:)'の使用を避けることを強く推奨します。 1つは、 '$'を使わない通貨があり、小数点の区切り記号として '.'を使わない地方の人がいます(例えば、$ 1,234,567.89はヨーロッパでは€1.234.567,89です) – Alexander

答えて

3

import Foundation 

extension Double { 
    var formattedAsLocalCurrency: String { 
     let currencyFormatter = NumberFormatter() 
     currencyFormatter.usesGroupingSeparator = true 
     currencyFormatter.numberStyle = .currency 
     currencyFormatter.locale = Locale.current 
     return currencyFormatter.string(from: NSNumber(value: self))! 
    } 
} 

print(0.01.formattedAsLocalCurrency) // => $0.01 
print(0.12.formattedAsLocalCurrency) // => $0.12 
print(1.23.formattedAsLocalCurrency) // => $1.23 
print(12.34.formattedAsLocalCurrency) // => $12.34 
print(123.45.formattedAsLocalCurrency) // => $123.45 
print(1234.56.formattedAsLocalCurrency) // => $1,234.56 
print((-1234.56).formattedAsLocalCurrency) // => -$1,234.56 
+0

大衆への質問:なぜ['NumberFormatter.string(from:)'](https://developer.apple.com/documentation/foundation/numberformatter/1418046-string)はオプションで?いつ失敗することができますか? – Alexander

+0

'localizedString'はオプションを返さないので不思議です。 – rmaddy

+0

確かに、 'NSNumber(bool:true)'を渡すとどうなりますか?しかし、 'localizedString'との矛盾は変です。 – HAS