Search code examples
iosswiftformattingswiftuinumber-formatting

NumberFormatter in SwiftUI - Use of unresolved identifier 'formatter'


In my SwiftUI app I will need to work with currencies. I am trying to use NumberFormatter, but getting an error:

Use of unresolved identifier 'formatter'

on line:

self.valueAsString = formatter.string(for: self.value)

Here is the code I have:

import SwiftUI

struct ContentView: View {
    @State private var newValueAsString = ""
    @State private var value: NSDecimalNumber = 0
    @State private var valueAsString = "0.0"
    
    let decimalBehavior = NSDecimalNumberHandler(roundingMode: .plain, scale: 2, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)
    
    private var currencyFormat: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.usesSignificantDigits = true
        formatter.minimumSignificantDigits = 1 // default
        formatter.maximumSignificantDigits = 6 // default
        return formatter
    }()
    
    var body: some View {
        VStack {
            TextField("0", text: $newValueAsString, onCommit: {
                self.value = NSDecimalNumber(string: self.newValueAsString, locale: Locale.current).rounding(accordingToBehavior: self.decimalBehavior)
                self.valueAsString = formatter.string(for: self.value)
                // Tried this too:
                //  self.valueAsString = "\(formatter.string(for: self.value))"
            }
            )
                .multilineTextAlignment(.trailing)
                .font(Font.system(size: 30))
                .keyboardType(.decimalPad)
            
            // Just to test. Later I will save the value to Core Data.
            Text("\(self.value)")
            Text("\(self.valueAsString)")
        }
        .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

What I wanted to do:

  1. Declare rules for currencyFormat using NumberFormatter.
  2. Write a value (newValueAsString) as String into the TextField.
  3. On Commit, newValueAsString is changed to NSDecimalNumber and assigned to self.value.
  4. Change NSDecimalNumber value back to String (valueAsString) using formatter rules. Here I am getting an error.

What am I doing wrong?


Solution

  • Probably you meant

    self.valueAsString = self.currencyFormat.string(for: self.value)