2017-01-09 7 views
15

私はSwiftプログラミングには新しく、Xcode 8.2で簡単なチップ電卓アプリを作成していましたが、私の計算は下記のIBActionに設定しました。しかし、私は実際に私のアプリを実行し、(23.45のような)計算するための金額を入力すると、2桁以上の小数点が表示されます。この場合、どうすれば.currencyにフォーマットするのですか?Doubleを通貨に変換する方法 - スウィフト3

String(format: "Tip Amount: $%.02f", tipAmount) 

あなたはそれがデバイスのロケール設定に完全に依存するようにしたい場合は、あなたが使用する必要があります:あなたは$に通貨を強制したい場合は、この文字列の初期化子を使用することができます

@IBAction func calculateButtonTapped(_ sender: Any) { 

    var tipPercentage: Double { 

     if tipAmountSegmentedControl.selectedSegmentIndex == 0 { 
      return 0.05 
     } else if tipAmountSegmentedControl.selectedSegmentIndex == 1 { 
      return 0.10 
     } else { 
      return 0.2 
     } 
    } 

    let billAmount: Double? = Double(userInputTextField.text!) 

    if let billAmount = billAmount { 
     let tipAmount = billAmount * tipPercentage 
     let totalBillAmount = billAmount + tipAmount 

     tipAmountLabel.text = "Tip Amount: $\(tipAmount)" 
     totalBillAmountLabel.text = "Total Bill Amount: $\(totalBillAmount)" 
    } 
} 

答えて

25

NumberFormatter。これは、通貨の小数点以下の桁数を考慮に入れ、通貨記号を正しく配置します。例えば。 double値2.4は、es_ESロケールでは「2,40€」、jp_JPロケールでは「¥2」を返します。

let formatter = NumberFormatter() 
formatter.locale = Locale.current // Change this to another locale if you want to force a specific locale, otherwise this is redundant as the current locale is the default already 
formatter.numberStyle = .currency 
if let formattedTipAmount = formatter.string(from: tipAmount as NSNumber) { 
    tipAmountLabel.text = "Tip Amount: \(formattedTipAmount)" 
} 
+0

FYI - フォーマッタの 'locale'を' Locale.current'に設定する必要はありません。デフォルトであるためです。 – rmaddy

+2

ええ、私はそれが冗長だと言うコメントを追加しました。それを簡単に変更することができることを示すためにそこに保持したい。 –

+0

非常にうまくいった。 –

7

これを行う最も良い方法は、NSNumberFormatterを作成することです。 (Swift 3のNumberFormatter)通貨を要求することができ、ユーザーの地域設定に従うように文字列を設定します。これは便利です。

あなたは米国形式ドルとセントの文字列を強制したい場合は、それをこのようにフォーマットすることができます:あなたは現在を取得している:

let currentLocale = Locale.current 
    let currencySymbol = currentLocale.currencySymbol 
    let outputString = "\(currencySymbol)\(String(format: "%.2f", totalBillAmount))" 

1行目:ここで

let amount: Double = 123.45 

let amountString = String(format: "$%.02f", amount) 
-1

の方法ですロケール

2行目:あなたはそのロケールのcurrencySymbolを取得しています。 ($、£など)

3行目:フォーマットの初期化子を使用して小数点以下2桁を切り捨てます。

+0

これをしないでください。 'NumberFormatter'を使います。このアプローチには、 'NumberFormatter'を使用することで簡単に回避できる多くの問題があります。 – rmaddy

6

他の人が議論NumberFormatterまたはString(format:)に加えて、あなたはDecimalNSDecimalNumberの使用を検討したいと丸め自分自身を制御することにより、ポイントの問題を浮動避けるかもしれません。シンプルなチップ計算機を使っているなら、それはおそらく必要ないでしょう。しかし、数字を四捨五入したり、10進数を使って数学をしたりしないと、一日の終わりにヒントを追加するようなことをしていると、エラーが発生する可能性があります。

だから、先に行くと、あなたのフォーマッタを設定します。どこ

extension Decimal { 

    /// Round `Decimal` number to certain number of decimal places. 
    /// 
    /// - Parameters: 
    /// - scale: How many decimal places. 
    /// - roundingMode: How should number be rounded. Defaults to `.plain`. 
    /// - Returns: The new rounded number. 

    func rounded(_ scale: Int, roundingMode: RoundingMode = .plain) -> Decimal { 
     var value = self 
     var result: Decimal = 0 
     NSDecimalRound(&result, &value, scale, roundingMode) 
     return result 
    } 
} 

もちろん、あなたは上記のすべてを置き換えることができます

let string = "2.03" 
let tipRate = Decimal(sign: .plus, exponent: -3, significand: 125) // 12.5% 
guard let billAmount = formatter.number(from: string) as? Decimal else { return } 
let tip = (billAmount * tipRate).rounded(2) 

guard let output = formatter.string(from: tip as NSDecimalNumber) else { return } 
print("\(output)") 

let formatter: NumberFormatter = { 
    let _formatter = NumberFormatter() 
    _formatter.numberStyle = .decimal 
    _formatter.minimumFractionDigits = 2 
    _formatter.maximumFractionDigits = 2 
    _formatter.generatesDecimalNumbers = true 
    return _formatter 
}() 

、その後は、小数点以下の数字を使用しますあなたが使用している通貨(またはおそらく私たち)に適した数字の「2小数点」の参照eは小数点以下桁数の変数)。

+0

なぜ、「NumberFormatter」に通貨スタイルを使用しないのですか?すべての通貨が小数点以下2桁を使用するわけではありません。 – rmaddy

+1

うん、あなたはそれを行うことができます。また、小数点以下の桁数を調べることもできます。確かに、 '.currency'を使用すると、他の問題が発生します(例えば、文字列の解析は難解なものになります。あなたが旅行していないと仮定して、他の通貨などを扱っています)。アプリによっては、小数点以下の桁数を指定して終了させる方が簡単な場合もあります。また、私の指摘はフォーマッタではなく、通貨による浮動小数点数の計算を避けるための一般的な助言でした。 – Rob

+0

丸め問題の別のアプローチは、「ドルとセント」(またはユーロやシェケルなど)の金額に100を掛けることです(100セントを持たない通貨の場合は、ユニット全体の小数点数)。その後、整数演算を使用して、出力を手動でフォーマットして小数点記号を挿入します。この方法はまた、浮動小数点エラーを回避する。 –

関連する問題