통화로 더블 포맷하는 방법 - 스위프트 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
'programing' 카테고리의 다른 글
어휘 폐쇄는 어떻게 작동합니까? (0) | 2023.08.20 |
---|---|
Swift에서 변수와 함께 NSLocalizedString 함수를 사용하는 방법은 무엇입니까? (0) | 2023.08.20 |
Swift Bridging 헤더 가져오기 문제 (0) | 2023.08.20 |
Excel 시트 안에 표 객체에 행을 삽입하는 방법? (0) | 2023.08.20 |
argc와 argv의 주소가 12바이트 차이가 나는 이유는 무엇입니까? (0) | 2023.08.20 |