vaibhav
vaibhav

Reputation: 4096

currency formatter swift 3

I am trying to format the textfield's input in currency standard format using its delegate method but the found solution is not upto the desire. I also found some solutions but nowhere i found the expected solution.

Requirements:

UITextField's Input: 300000

Getting: 30,0000

Desired Output: 300,000

Using code:

//MARK:- textfield delegate method
func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
    
    guard let textFieldHasText = (textField.text), !textFieldHasText.isEmpty else {
        //early escape if nil
        return true
    }
    
    if textField == self.reqCourps || textField == self.presentInvest{
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        
        //remove any existing commas
        let textRemovedCommma = textFieldHasText.replacingOccurrences(of: ",", with: "")
        
        //update the textField with commas
        let formattedNum = formatter.string(from: NSNumber(value: Int(textRemovedCommma)!))
        
        textField.text = formattedNum
    }
    
    
    guard let text = textField.text else { return true }
    let newLength = text.characters.count + string.characters.count - range.length
    return newLength <= 12 // Bool
    
}

When i use .currency method it crashes the app also:

formatter.numberStyle = .currency

Upvotes: 1

Views: 2833

Answers (3)

Sweeper
Sweeper

Reputation: 270758

I think this is due to your locale settings. In some areas of the world, they have number formats like that. I tested your code and it worked fine, so I guess there must be something with wrong with your locale.

If you want the number to be in the US style, just set the locale explicitly:

// here pass your textfield value that you want to convert into doller.

 let price = NSDecimalNumber(string: self.textfield.text) as NSNumber
 let formatter = NumberFormatter()
 formatter.numberStyle = .currency
 formatter.locale = Locale(identifier: "en_US")
 formatter.string(from: price)
 print(formatter.string(from: price)!)

Output:

$8,965.00

Upvotes: 0

user4003752
user4003752

Reputation:

Here is code

func getNumberWithFormat(_ number : NSNumber, format : String) -> String {
     let numberFormatter = NumberFormatter()
     numberFormatter.locale = Locale.current
     numberFormatter.numberStyle = NumberFormatter.Style.decimal
     numberFormatter.usesGroupingSeparator = true

     numberFormatter.positiveFormat = format
     return numberFormatter.string(from: number)! 
}

You can call this function like,

let number : NSNumber = 300000 
print("Number is : ", getNumberWithFormat(number, format: "###,###"))

Your output will be

Number is :  300,000

Upvotes: 2

weikel
weikel

Reputation: 164

import UIKit

open class DecimalFormatter: NumberFormatter {

    public override init() {
        super.init()
        locale = Locale.current
        numberStyle = .decimal
        minimumFractionDigits = 2
        maximumFractionDigits = 2
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override open func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, range rangep: UnsafeMutablePointer<NSRange>?) throws {
        guard obj != nil else { return  }
        let str = string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
        obj?.pointee = NSNumber(value: (Double(str) ?? 0.0)/Double(pow(10.0, Double(minimumFractionDigits))))
    }
}


let originString = NSNumber.init(value: 30000)
let result = DecimalFormatter().string(from: originString)

you will get 30,000.00 if u want get 30,000, just change "minimumFractionDigits" to "0"

Upvotes: 0

Related Questions