programing

통화로 더블 포맷하는 방법 - 스위프트 3.

bestprogram 2023. 8. 20. 12:18

통화로 더블 포맷하는 방법 - 스위프트 3.

저는 스위프트 프로그래밍에 처음이고 Xcode 8.2에서 간단한 팁 계산기 앱을 만들고 있습니다. 제 계산은 제 안에 설정되어 있습니다.IBAction아래. 그런데 실제로 앱을 실행하고 계산할 금액(23.45 등)을 입력하면 소수점 이하가 2자리 이상 나옵니다.형식을 어떻게 해야 합니까?.currency이 경우에?

@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)"
    }
}

통화를 $로 설정하려면 이 문자열 이니셜라이저를 사용할 수 있습니다.

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

디바이스의 로케일 설정에 완전히 종속되도록 하려면 다음을 사용해야 합니다.NumberFormatter이는 통화 기호를 올바르게 배치할 뿐만 아니라 통화의 소수 자릿수도 고려합니다.예를 들어, 두 배 값 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)"
}

Swift 4에서 수행하는 방법:

let myDouble = 9999.99
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
// localize to your grouping and decimal separator
currencyFormatter.locale = Locale.current

// We'll force unwrap with the !, if you've got defined data you may need more error checking

let priceString = currencyFormatter.string(from: NSNumber(value: myDouble))!
print(priceString) // Displays $9,999.99 in the US locale

당신은 그렇게 변환할 수 있습니다: 이 함수 변환은 당신이 원할 때마다 maximumFractionDigits를 유지합니다.

static func df2so(_ price: Double) -> String{
        let numberFormatter = NumberFormatter()
        numberFormatter.groupingSeparator = ","
        numberFormatter.groupingSize = 3
        numberFormatter.usesGroupingSeparator = true
        numberFormatter.decimalSeparator = "."
        numberFormatter.numberStyle = .decimal
        numberFormatter.maximumFractionDigits = 2
        return numberFormatter.string(from: price as NSNumber)!
    } 

나는 그것을 클래스 모델에서 만들고, 당신이 부를 때, 당신은 그것을 다른 클래스로 받아들일 수 있습니다, 이렇게.

 print("InitData: result convert string " + Model.df2so(1008977.72))
//InitData: result convert string "1,008,977.72"

Swift 5.5 버전에서는 다음과 같은 기능을 사용할 수 있습니다..formatted:

import Foundation

let amount = 12345678.9
print(amount.formatted(.currency(code: "USD")))
// prints: $12,345,678.90

이것은 "EUR", "GBP" 또는 "CNY"와 같은 대부분의 일반적인 통화 코드를 지원해야 합니다.

마찬가지로 다음에 로케일을 추가할 수 있습니다..currency:

print(amount.formatted(
    .currency(code:"EUR").locale(Locale(identifier: "fr-FR"))
))
// prints: 12 345 678,90 €

문자열 또는 Int에 대한 확장을 만들 수 있습니다. String을 사용하여 예제를 보여드리겠습니다.

extension String{
     func toCurrencyFormat() -> String {
        if let intValue = Int(self){
           let numberFormatter = NumberFormatter()
           numberFormatter.locale = Locale(identifier: "ig_NG")/* Using Nigeria's Naira here or you can use Locale.current to get current locale, please change to your locale, link below to get all locale identifier.*/ 
           numberFormatter.numberStyle = NumberFormatter.Style.currency
           return numberFormatter.string(from: NSNumber(value: intValue)) ?? ""
      }
    return ""
  }
}

모든 로케일 식별자를 가져오는 링크

이 작업을 수행하는 가장 좋은 방법은 다음을 만드는 것입니다.NSNumberFormatter. (NumberFormatter스위프트 3에서.)통화를 요청할 수 있으며 사용자의 현지화 설정을 따르도록 문자열을 설정하여 유용합니다.

번호를 사용하는 대신포맷터, US 형식의 달러 및 센트 문자열을 강제로 지정하려면 다음과 같은 방법으로 포맷할 수 있습니다.

let amount: Double = 123.45

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

그 외에도NumberFormatter또는String(format:)다른 사람들에 의해 논의되고, 당신은 사용을 고려하는 것이 좋을 것입니다.Decimal또는NSDecimalNumber반올림을 직접 제어하여 부동 소수점 문제를 방지할 수 있습니다.간단한 팁 계산기를 사용하는 경우에는 그럴 필요가 없습니다.하지만 만약 여러분이 하루의 마지막에 팁을 더하는 것과 같은 일을 하고 있다면, 만약 여러분이 숫자를 반올림하거나 십진수를 사용하여 계산하지 않는다면, 여러분은 오류를 일으킬 수 있습니다.

이제 포맷터를 구성합니다.

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

그런 다음 십진수를 사용합니다.

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)")

어디에

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

위의 모든 "소수점 2자리" 참조를 사용 중인 통화에 적합한 숫자로 바꿀 수 있습니다(또는 소수점 숫자에 변수를 사용할 수도 있습니다).

 extension String{
    func convertDoubleToCurrency() -> String{
        let amount1 = Double(self)
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .currency
        numberFormatter.locale = Locale(identifier: "en_US")
        return numberFormatter.string(from: NSNumber(value: amount1!))!
    }
}

2022년 Swift 5.5를 사용하여 장치의 로케일 또는 인수로 전달한 로케일을 사용하여 Float 또는 Double을 통화로 변환하는 확장을 만들었습니다.https://github.com/ahenqs/SwiftExtensions/blob/main/Currency.playground/Contents.swift 에서 확인할 수 있습니다.

import UIKit

extension NSNumber {
    
    /// Converts an NSNumber into a formatted currency string, device's current Locale.
    var currency: String {
        return self.currency(for: Locale.current)
    }
    
    /// Converts an NSNumber into a formatted currency string, using Locale as a parameter.
    func currency(for locale: Locale) -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.usesGroupingSeparator = locale.groupingSeparator != nil
        numberFormatter.numberStyle = .currency
        numberFormatter.locale = locale
        
        return numberFormatter.string(from: self)!
    }
}

extension Double {
    
    /// Converts a Double into a formatted currency string, device's current Locale.
    var currency: String {
        return NSNumber(value: self).currency(for: Locale.current)
    }
    
    /// Converts a Double into a formatted currency string, using Locale as a parameter.
    func currency(for locale: Locale) -> String {
        return NSNumber(value: self).currency(for: locale)
    }
}

extension Float {
    
    /// Converts a Float into a formatted currency string, device's current Locale.
    var currency: String {
        return NSNumber(value: self).currency(for: Locale.current)
    }
    
    /// Converts a Float into a formatted currency string, using Locale as a parameter.
    func currency(for locale: Locale) -> String {
        return NSNumber(value: self).currency(for: locale)
    }
}

let amount = 3927.75 // Can be either Double or Float, since we have both extensions.
let usLocale = Locale(identifier: "en-US") // US
let brLocale = Locale(identifier: "pt-BR") // Brazil
let frLocale = Locale(identifier: "fr-FR") // France
print("\(Locale.current.identifier) -> " + amount.currency) // default current device's Locale.
print("\(usLocale.identifier) -> " + amount.currency(for: usLocale))
print("\(brLocale.identifier) -> " + amount.currency(for: brLocale))
print("\(frLocale.identifier) -> " + amount.currency(for: frLocale))

// will print something like this:
// en_US -> $3,927.75
// en-US -> $3,927.75
// pt-BR -> R$ 3.927,75
// fr-FR -> 3 927,75 €

도움이 되었으면 좋겠어요, 해피 코딩!

extension Float {
    var localeCurrency: String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = .current
        return formatter.string(from: self as NSNumber)!
    }
}
    amount = 200.02
    print("Amount Saved Value ",String(format:"%.2f", amountSaving. localeCurrency))

나는 0.00을 반환합니다!접속 시 Extension Perfect로 보입니다. 0.00을 반환합니다. 왜요?

여기 제가 해온 쉬운 방법이 있습니다.

extension String {
    func toCurrency(Amount: NSNumber) -> String {
        var currencyFormatter = NumberFormatter()
        currencyFormatter.usesGroupingSeparator = true
        currencyFormatter.numberStyle = .currency
        currencyFormatter.locale = Locale.current

        return currencyFormatter.string(from: Amount)!
    }
}

다음과 같이 사용됩니다.

let amountToCurrency = NSNumber(99.99)
String().toCurrency(Amount: amountToCurrency)

방법:

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

첫 번째 줄:현재 로케일을 받는 중입니다.

두 번째 줄:해당 로케일에 대한 통화 기호가 표시됩니다.($, £ 등)

세 번째 줄:이니셜라이저 형식을 사용하여 소수점 두 자리로 두 배를 자릅니다.

언급URL : https://stackoverflow.com/questions/41558832/how-to-format-a-double-into-currency-swift-3