2016-12-21 3 views
0

Ich versuche eine UITextField zu machen, wo die Eingabe dauerhaft im Währungsformat angezeigt wird, obwohl der Benutzer gerade bearbeitet. Es sollte wie arbeiten:UITextField-Anzeige als Währung ohne Dezimalzahl formatiert

$0 

Benutzertyp 1

$1 

Benutzertyp 2

$12 

Benutzertyp 0

$120 

Benutzertyp 0

$1,200 

Benutzertyp 0

$12,000 

Ich schaffe die endgültige Formatierung

textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!)!)))?.components(separatedBy: ".")[0] 

erhalten mit NumberFormatter wie Aber sobald ich den Text in das Textfeld formatieren, werden nachfolgende Eingabe verursachen Fehler wie:

$1,000 

Benutzertyp 0

Gibt es sowieso ich kann die Eingabe manipulieren, damit der Benutzer nur Zahlen eingeben muss, aber der Wert in der richtigen Währungsformatierung mit dem Symbol plus Kommas angezeigt wird - z. B. $ 1,200,000. Unabhängig von der Anzahl der Ziffern - aber logisch bis 10 ist genug.

Mein aktueller Textfield shouldChangeCharactersInRange ist wie folgt:

textField.text = numberFormatter.number(from: textField.text!)?.description 

    if(range.length == 1){ //Backspace 
     if(textField.text?.characters.count == 1){ 
      textField.text = "$0" 
      return false 
     } 
     return true 
    } 
    if(string.trimmingCharacters(in: CharacterSet.decimalDigits.inverted) == ""){ 
     textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!)!)))?.components(separatedBy: ".")[0] 
     return false 
    } 
    if(string == ".") { 
     textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!)!)))?.components(separatedBy: ".")[0] 
     return false 
    } 

    textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!.append(string)!)!)))?.components(separatedBy: ".")[0] 
    return false 
+0

auch dankbar, wenn jemand Tipps geben kann mir die Menge der Klammer reduzieren zu helfen, und der Code aussehen sauberer machen, ohne zu viele Zeilen hinzufügen zu müssen. –

Antwort

1

unten Code Versuchen wäre

extension ViewController: UITextFieldDelegate { 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

     let text: NSString = (textField.text ?? "") as NSString 
     let finalString = text.replacingCharacters(in: range, with: string) 

     // 'currency' is a String extension that doews all the number styling 
     amountTextField.text = finalString.currency 

     // returning 'false' so that textfield will not be updated here, instead from styling extension 
     return false 
    } 
} 

extension String { 
    var currency: String { 
     // removing all characters from string before formatting 
     let stringWithoutSymbol = self.replacingOccurrences(of: "$", with: "") 
     let stringWithoutComma = stringWithoutSymbol.replacingOccurrences(of: ",", with: "") 

     let styler = NumberFormatter() 
     styler.minimumFractionDigits = 0 
     styler.maximumFractionDigits = 0 
     styler.currencySymbol = "$" 
     styler.numberStyle = .currency 

     if let result = NumberFormatter().number(from: stringWithoutComma) { 
      return styler.string(from: result)! 
     } 

     return self 
    } 
} 
+0

Das ist schlau!Ich habe immer daran gedacht, den Zahlenformatierer zu benutzen, um meine Saite zu behalten. Ich habe diese Möglichkeit völlig verpasst. –

+0

Gern geschehen – Matt

0

können Sie die leftView und rightView Eigenschaften des UITextField verwenden, wie unten dargestellt: Dies wird nur auf der linken Seite des Eingangs sorgen die „$“ Zeichen für die Anzeige Feld.

override func viewDidLoad() { 
     super.viewDidLoad() 

     let label = UILabel(frame: CGRect(x :0,y :0,width :10,height: 10)) 
     label.text = "$" 

     self.moneyTextField.leftViewMode = .always 
     self.moneyTextField.leftView = label 

    } 
+0

Eigentlich habe ich nicht viel Probleme mit dem Währungssymbol, da Nummerformatierer helfen wird, sich darum zu kümmern. Es sind die Kommas, mit denen ich Probleme habe. Es wird die Formatierung brechen, sobald der Benutzer mehr als 4 Zahlen in –

2
// ViewController.swift 
// TextfieldDemo 
// 
// Created by piyush sinroja on 21/12/16. 


import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var txtDigit: UITextField! 

    var strDigit: String = String() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let label = UILabel(frame: CGRect(x :0,y :0,width :10,height: 10)) 
     label.text = "$" 
     self.txtDigit.leftViewMode = .always 
     self.txtDigit.leftView = label 

     txtDigit.layer.cornerRadius = 4.0 
     txtDigit.layer.masksToBounds = true 
     txtDigit.layer.borderColor = UIColor.lightGray.cgColor 
     txtDigit.layer.borderWidth = 1.0 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 

    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 

    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     return true 
    } 

    func textField(_ textFieldToChange: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     if textFieldToChange == txtDigit{ 
      let aSet = NSCharacterSet(charactersIn:"").inverted 
      let compSepByCharInSet = string.components(separatedBy: aSet) 
      let numberFiltered = compSepByCharInSet.joined(separator: "") 

      if numberFiltered == "" { 
       let new = txtDigit.text! 
       let fsf = new.substring(to: new.index(new.endIndex, offsetBy: -1)) 
       let currentString = fsf 
       let findStr = commaStrSet(currentString: currentString) 
       txtDigit.text = findStr 
       return false 
      } 
      else{ 
       let currentString = (textFieldToChange.text! as NSString) 
        .replacingCharacters(in: range, with: string) 
       let findStr = commaStrSet(currentString: currentString) 
       txtDigit.text = findStr 
      } 
     } 
     return false 
    } 

    func commaStrSet(currentString: String) -> String { 
     var replaceStr = currentString.replacingOccurrences(of: ",", with: "") 
     let length = replaceStr.characters.count 
     switch length { 
     case 4: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
     case 5: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 2)) 
     case 6: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 5)) 
     case 7: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 2)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 5)) 
     case 8: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 4)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 7)) 
     case 9: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 2)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 5)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 8)) 
     case 10: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 4)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 7)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 10)) 
     case 11,12,13,14,15: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 4)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 7)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 10)) 
     default: 
      break 
     } 

     return replaceStr 
    } 
} 
+0

obigen Code ist 100% arbeiten –

+0

Ich habe versucht, die Codes und es scheint, der Offset ist falsch und ich habe versucht, es zu korrigieren. Danke für die Hilfe. –

+0

nein, es funktioniert gut. Ich habe nur für dich gemacht, du kannst deine eigene Logik verwenden –

Verwandte Themen