NSNumber를 사용하여 통화 입력 형식 지정스위프트의 포맷터
저는 사용자가 거래뿐만 아니라 예산을 입력할 수 있는 예산 앱을 만들고 있습니다.사용자가 별도의 텍스트 필드에서 펜스와 파운드를 모두 입력할 수 있도록 허용해야 하며 통화 기호와 함께 형식을 지정해야 합니다.저는 현재 이것이 잘 작동하고 있지만 현재 GBP에서만 작동하기 때문에 현지화하고 싶습니다.NSNumber를 변환하는 데 어려움을 겪고 있습니다.목표-C에서 스위프트까지의 포맷터 예제.
첫 번째 문제는 입력 필드의 자리 표시자를 사용자 위치에 맞게 설정해야 한다는 것입니다.예: 파운드와 펜스, 달러와 센트 등...
두 번째 문제는 10216, 32와 같은 각 텍스트 필드에 입력된 값의 형식을 지정하고 사용자 위치에 맞는 통화 기호를 추가해야 한다는 것입니다.따라서 10,216.32파운드 또는 10,216.32달러 등이 됩니다.
또한 포맷된 숫자의 결과를 계산에 사용해야 합니다.그렇다면 통화 기호와 관련된 문제를 겪지 않고 어떻게 문제를 겪지 않고 이를 수행할 수 있을까요?
다음은 Swift 3에서 사용하는 방법에 대한 예입니다. (편집:Swift 5에서도 작동)
let price = 123.436 as NSNumber
let formatter = NumberFormatter()
formatter.numberStyle = .currency
// formatter.locale = NSLocale.currentLocale() // This is the default
// In Swift 4, this ^ was renamed to simply NSLocale.current
formatter.string(from: price) // "$123.44"
formatter.locale = Locale(identifier: "es_CL")
formatter.string(from: price) // $123"
formatter.locale = Locale(identifier: "es_ES")
formatter.string(from: price) // "123,44 €"
다음은 Swift 2에서 사용하는 방법에 대한 오래된 예입니다.
let price = 123.436
let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
// formatter.locale = NSLocale.currentLocale() // This is the default
formatter.stringFromNumber(price) // "$123.44"
formatter.locale = NSLocale(localeIdentifier: "es_CL")
formatter.stringFromNumber(price) // $123"
formatter.locale = NSLocale(localeIdentifier: "es_ES")
formatter.stringFromNumber(price) // "123,44 €"
스위프트 3:
다음과 같은 이점을 제공하는 솔루션을 찾고 있는 경우:
- "5" = "$5"
- "5.0" = "$5"
- "5.00" = "$5"
- "5.5" = "$5.50"
- "5.50" = "$5.50"
- "5.55" = "$5.55"
- "5.234234" = "5.23"
다음을 사용하십시오.
func cleanDollars(_ value: String?) -> String {
guard value != nil else { return "$0.00" }
let doubleValue = Double(value!) ?? 0.0
let formatter = NumberFormatter()
formatter.currencyCode = "USD"
formatter.currencySymbol = "$"
formatter.minimumFractionDigits = (value!.contains(".00")) ? 0 : 2
formatter.maximumFractionDigits = 2
formatter.numberStyle = .currencyAccounting
return formatter.string(from: NSNumber(value: doubleValue)) ?? "$\(doubleValue)"
}
@NinoScript에서 제공하는 솔루션을 확장 버전으로 구현했습니다.
확장
// Create a string with currency formatting based on the device locale
//
extension Float {
var asLocaleCurrency:String {
var formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.locale = NSLocale.currentLocale()
return formatter.stringFromNumber(self)!
}
}
용도:
let amount = 100.07
let amountString = amount.asLocaleCurrency
print(amount.asLocaleCurrency())
// prints: "$100.07"
스위프트 3
extension Float {
var asLocaleCurrency:String {
var formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale.current
return formatter.string(from: self)!
}
}
Xcode 11 • Swift 5.1
extension Locale {
static let br = Locale(identifier: "pt_BR")
static let us = Locale(identifier: "en_US")
static let uk = Locale(identifier: "en_GB") // ISO Locale
}
extension NumberFormatter {
convenience init(style: Style, locale: Locale = .current) {
self.init()
self.locale = locale
numberStyle = style
}
}
extension Formatter {
static let currency = NumberFormatter(style: .currency)
static let currencyUS = NumberFormatter(style: .currency, locale: .us)
static let currencyBR = NumberFormatter(style: .currency, locale: .br)
}
extension Numeric {
var currency: String { Formatter.currency.string(for: self) ?? "" }
var currencyUS: String { Formatter.currencyUS.string(for: self) ?? "" }
var currencyBR: String { Formatter.currencyBR.string(for: self) ?? "" }
}
let price = 1.99
print(Formatter.currency.locale) // "en_US (current)\n"
print(price.currency) // "$1.99\n"
Formatter.currency.locale = .br
print(price.currency) // "R$1,99\n"
Formatter.currency.locale = .uk
print(price.currency) // "£1.99\n"
print(price.currencyBR) // "R$1,99\n"
print(price.currencyUS) // "$1.99\n"
세부 사항
- Xcode 10.2.1(10E1001), Swift 5
해결책
import Foundation
class CurrencyFormatter {
static var outputFormatter = CurrencyFormatter.create()
class func create(locale: Locale = Locale.current,
groupingSeparator: String? = nil,
decimalSeparator: String? = nil,
style: NumberFormatter.Style = NumberFormatter.Style.currency) -> NumberFormatter {
let outputFormatter = NumberFormatter()
outputFormatter.locale = locale
outputFormatter.decimalSeparator = decimalSeparator ?? locale.decimalSeparator
outputFormatter.groupingSeparator = groupingSeparator ?? locale.groupingSeparator
outputFormatter.numberStyle = style
return outputFormatter
}
}
extension Numeric {
func toCurrency(formatter: NumberFormatter = CurrencyFormatter.outputFormatter) -> String? {
guard let num = self as? NSNumber else { return nil }
var formatedSting = formatter.string(from: num)
guard let locale = formatter.locale else { return formatedSting }
if let separator = formatter.groupingSeparator, let localeValue = locale.groupingSeparator {
formatedSting = formatedSting?.replacingOccurrences(of: localeValue, with: separator)
}
if let separator = formatter.decimalSeparator, let localeValue = locale.decimalSeparator {
formatedSting = formatedSting?.replacingOccurrences(of: localeValue, with: separator)
}
return formatedSting
}
}
사용.
let price = 12423.42
print(price.toCurrency() ?? "")
CurrencyFormatter.outputFormatter = CurrencyFormatter.create(style: .currencyISOCode)
print(price.toCurrency() ?? "nil")
CurrencyFormatter.outputFormatter = CurrencyFormatter.create(locale: Locale(identifier: "es_ES"))
print(price.toCurrency() ?? "nil")
CurrencyFormatter.outputFormatter = CurrencyFormatter.create(locale: Locale(identifier: "de_DE"), groupingSeparator: " ", style: .currencyISOCode)
print(price.toCurrency() ?? "nil")
CurrencyFormatter.outputFormatter = CurrencyFormatter.create(groupingSeparator: "_", decimalSeparator: ".", style: .currencyPlural)
print(price.toCurrency() ?? "nil")
let formatter = CurrencyFormatter.create(locale: Locale(identifier: "de_DE"), groupingSeparator: " ", decimalSeparator: ",", style: .currencyPlural)
print(price.toCurrency(formatter: formatter) ?? "nil")
결과.
$12,423.42
USD12,423.42
12.423,42 €
12 423,42 EUR
12_423.42 US dollars
12 423,42 Euro
@Michael Voccola의 답변에서 Swift 4에 대해 업데이트되었습니다.
extension Double {
var asLocaleCurrency: String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale.current
let formattedString = formatter.string(from: self as NSNumber)
return formattedString ?? ""
}
}
참고: 강제로 포장을 풀거나 강제로 포장을 풀지 않는 것은 사악합니다.
Swift 4 텍스트 필드 구현
var value = 0
currencyTextField.delegate = self
func numberFormatting(money: Int) -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = .current
return formatter.string(from: money as NSNumber)!
}
currencyTextField.text = formatter.string(from: 50 as NSNumber)!
func textFieldDidEndEditing(_ textField: UITextField) {
value = textField.text
textField.text = numberFormatting(money: Int(textField.text!) ?? 0 as! Int)
}
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.text = value
}
extension Float {
var convertAsLocaleCurrency :String {
var formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale.current
return formatter.string(from: self as NSNumber)!
}
}
이것은 swift 3.1 x code 8.2.1에서 작동합니다.
스위프트 4
formatter.locale = Locale.current
로케일을 바꾸고 싶다면 이렇게 하면 됩니다.
formatter.locale = Locale.init(identifier: "id-ID")
인도네시아 로케일의 로케일입니다.휴대폰 영역별로 사용하려면 위에 언급된 Locale.current와 같이 사용합니다.
//MARK:- Complete code
let formatter = NumberFormatter()
formatter.numberStyle = .currency
if let formattedTipAmount = formatter.string(from: Int(newString)! as
NSNumber) {
yourtextfield.text = formattedTipAmount
}
이 함수를 추가합니다.
func addSeparateMarkForNumber(int: Int) -> String {
var string = ""
let formatter = NumberFormatter()
formatter.locale = Locale.current
formatter.numberStyle = .decimal
if let formattedTipAmount = formatter.string(from: int as NSNumber) {
string = formattedTipAmount
}
return string
}
사용:
let giaTri = value as! Int
myGuessTotalCorrect = addSeparateMarkForNumber(int: giaTri)
언급URL : https://stackoverflow.com/questions/24960621/formatting-input-for-currency-with-nsnumberformatter-in-swift
'programing' 카테고리의 다른 글
| Kotlin에서 Spring 매개변수화된 유형 참조 인스턴스(instance) 작성 (0) | 2023.07.30 |
|---|---|
| 윈도우즈 7의 PowerShell: 일반 사용자를 위한 실행 정책 설정 (0) | 2023.07.30 |
| 부트스트랩 4의 class="mb-0"은 무엇입니까? (0) | 2023.07.30 |
| Android 응용 프로그램에서 현재 시간 및 날짜 표시 (0) | 2023.07.30 |
| T-SQL(SQL Server)에서 "Duplicate Key" 오류를 무시하는 방법 (0) | 2023.07.30 |