formatter will das , nicht akzeptieren

  • formatter will das , nicht akzeptieren

    Hallo liebe Entwickler,

    wie muß ich das bitte richtig stellen damit ich mit dezimalstellen rechnen kann wenn man ein deutsches dezimal pad verwendet?
    wenn ich im simulator das englisch einstelle funktioniert es wunderbar.


    Quellcode

    1. @IBAction func textEditingChanged(sender: UITextField) {
    2. if sender === grdmaß {
    3. let num1 = Double(grdmaß.text!)
    4. let num2 = Double(frsthö.text!)
    5. let num3 = Double(trfhö.text!)
    6. let num4 = Double(vrdalä.text!)
    7. let a = atan((num2! - num3!) / (num1! + num4!))
    8. let b = a / 3.14 * 180
    9. let c = round( b / 0.01)*0.01
    10. dchng.text = "\(c)"
    11. }
    12. }
    13. extension ViewController: UITextFieldDelegate {
    14. func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString input: String) -> Bool {
    15. if let old = textField.text,
    16. sep = formatter.decimalSeparator {
    17. if input == sep && old.rangeOfString(sep) != nil {
    18. return false
    19. }
    20. if input != " " && old.characters.count > 9 {
    21. return false
    22. }
    23. }
    24. return true
    25. }
    26. }
    Alles anzeigen
    ausgabe der konsole: Can't find keyplane that supports type 8 for keyboard iPhone-Portrait-DecimalPad; using 4131139949_Portrait_iPhone-Simple-Pad_Default
    fatal error: unexpectedly found nil while unwrapping an Optional value

    danke schonmal für eure hilfe!!!
  • darüber hab ich schon gelesen ja aber irgendwie will das bei mir nicht, hab das hier auch schon mit im code drin.


    Quellcode

    1. let formatter = NSNumberFormatter()
    2. formatter.maximumFractionDigits = 2
    3. formatter.minimumFractionDigits = 0
    4. formatter.groupingSeparator = "\u{2006}" // kleiner Abstand
    5. formatter.usesGroupingSeparator = true
    oder fehlt da noch etwas?
  • gelöst!!!

    das noch hinzugefügt

    Quellcode

    1. formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
    2. formatter.stringFromNumber(1234.567) // 1.234,567
    3. formatter.stringFromNumber(1234) // 1234,00

    und func geändert


    Quellcode

    1. @IBAction func textEditingChanged(sender: UITextField) {
    2. if sender === grdmaß {
    3. let num1 = formatter.numberFromString(grdmaß.text!)
    4. let num2 = Double(frsthö.text!)
    5. let num3 = Double(trfhö.text!)
    6. let num4 = Double(vrdalä.text!)
    7. let a = atan((num2! - num3!) / (Double(num1!) + num4!))
    8. let b = a / 3.14 * 180
    9. let c = round( b / 0.01)*0.01
    10. dchng.text = "\(c)"
    11. }
    Alles anzeigen
    so erkennt es erstmal das ","
  • Immer wenn ich 2 dezimalstellen lesen werde ich hellhörig. Das sieht dann immer stark nach einem Preis aus. Da solltest du aber intern schön aufpassen und mit int rechnen und auf keinen Fall mit double. Sonst hast du irgendwann ein echtes Problem wenn dein Kunde feststellt das dein Programm ab und zu mal ein paar Pfennige falsch liegt.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • @macmoonshine & @Thallius genau nix mit preis geht um reine mathematik am bau :D hab es auch geändert in 3 stellen hinter dem komma.
    der einwand mit zeile 11 ist berechtigt aber egal wie ich es anstelle gibt immer ein roten kreis mit ausrufezeichen links vom code :( , weil nach dem berechnen haut es mir immer einen punkt als dezimalzeichen rein und das wollt ich so nicht.
    nun geht auch das englische pad nicht mehr wo ein punkt statt komma drin ist.
    nun war mein gedanke mit dem nsscanner zu arbeiten und das komma bei der eingabe suchen zu lassen und mit dem punkt ersetzen.......ist das vlt eine bessere lösung damit alle beide dezimalzeichen verarbeitet werden?
  • Ganz großen Danke für Eure hilfe!!!

    Nun bin ich wieder ein Stück weiter gekommen. (was lange wehr wird......naja :) )

    meine Lösung sieht so aus:

    Quellcode

    1. let formatter = NSNumberFormatter()
    2. formatter.maximumFractionDigits = 3
    3. formatter.minimumFractionDigits = 2
    4. formatter.groupingSeparator = "\u{2006}" // kleiner Abstand
    5. formatter.usesGroupingSeparator = true
    6. @IBAction func textEditingChanged(sender: UITextField) {
    7. var num:Double
    8. if let decimal = formatter.numberFromString(sender.text!) {
    9. num = Double(decimal)
    10. } else {
    11. num = 0.0
    12. }
    13. let num1 = formatter.numberFromString(grdmaß.text!)
    14. let num2 = formatter.numberFromString(frsthö.text!)
    15. let num3 = formatter.numberFromString(trfhö.text!)
    16. let num4 = formatter.numberFromString(vrdalä.text!)
    17. if sender === grdmaß {
    18. let a = atan((Double(num2!) - Double(num3!)) / (Double(num) + Double(num4!)))
    19. let b = a / M_PI * 180
    20. let c = round( b / 0.01)*0.01
    21. dchng.text = formatter.stringFromNumber(c)
    22. }else if sender === frsthö {
    23. let a = atan((Double(num) - Double(num3!)) / (Double(num1!) + Double(num4!)))
    24. let b = a / M_PI * 180
    25. let c = round( b / 0.01)*0.01
    26. dchng.text = formatter.stringFromNumber(c)
    27. }else if sender === trfhö {
    28. let a = atan((Double(num2!) - Double(num)) / (Double(num1!) + Double(num4!)))
    29. let b = a / M_PI * 180
    30. let c = round( b / 0.01)*0.01
    31. dchng.text = formatter.stringFromNumber(c)
    32. }else if sender === vrdalä {
    33. let a = atan((Double(num2!) - Double(num3!)) / (Double(num1!) + Double(num)))
    34. let b = a / M_PI * 180
    35. let c = round( b / 0.01)*0.01
    36. dchng.text = formatter.stringFromNumber(c)
    37. }
    38. }
    39. }
    40. extension ViewController: UITextFieldDelegate {
    41. func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString input: String) -> Bool {
    42. if let old = textField.text,
    43. sep = formatter.decimalSeparator {
    44. if input == sep && old.rangeOfString(sep) != nil {
    45. return false
    46. }
    47. if input != " " && old.characters.count > 9 {
    48. return false
    49. }
    50. }
    51. return true
    52. }
    53. }
    Alles anzeigen
    kann man an dem Code noch etwas einkürzen oder ist das Okay so?

    manchmal sieht man den Wald vor Bäumen nicht, stand ja alles in meinem Buch zu Swift 2.0 und noch ein Fehler war, das ich die Felder vorausgefüllt hatte mit Komma somit ging also die US Variante nicht, hab ich alles mit Punkt gemacht ging die DE Variante nicht :evil: ........nun überall nur eine Null eingesetzt und siehe da beide funktionieren.