数字格式化程序不允许显示小数

时间:2017-08-26 03:43:38

标签: ios swift numberformatter

这是强制性的“我是编程的新手”但是,我已经搜索了所有可用的答案并得出结论,我的问题可能与代码相关的逻辑更多,但我可能是错的关于那个。我正在构建一个计算器应用程序,除显示中的numberFormatter(显示逗号分隔符)外,一切正常。每当我尝试格式化显示中的数字时,我都无法显示小数点和逗号。

如果我以十进制.1234开头,我得到0.1234,如果我输入12345,我得到12,345,但如果我输入12345.678,我得到12,345。我正在丢失小数。我已经测试了它和我的功能,以删除无关的“。”似乎不是问题。如果我在标签格式化控件之外运行字符串扩展名numberFormatter它似乎工作,但我需要防止多个小数和无关的“0”。

我正在向IBAction展示代码,其中包含显示标签display.text上显示的按钮。在此之后的所有计算都正常工作,replacingOccurrences(of: ",", with: "")创建一个干净的字符串以转换为Double并进行计算。

我正在使用sting扩展来进行格式化。几个星期以来,我一直在努力。有任何想法吗?我是否必须重构我如何在label.text中输入文字?

这是向UILabel display添加文字的代码。

@IBAction func btnTouchDigit(_ sender: UIButton) {

        let digit = sender.currentTitle!

        if isUserTyping {
            var formattedNumber = ""

            print( "is user typting + String\(isUserTyping)")

            // make sure we aren't adding a second period

            var textCurrentlyInDisplay = display.text
            textCurrentlyInDisplay = textCurrentlyInDisplay?.replacingOccurrences(of: ",", with: "")

            if digit == "." && ((textCurrentlyInDisplay?.range(of: ".")) != nil) {
                return
            }
            else {
                formattedNumber = (textCurrentlyInDisplay! + digit)
                print("formattedNumber = \(formattedNumber.twoFractionDigits)")
                display.text = formattedNumber.twoFractionDigits

                // put code here to format label.text to show thousand seperators
                print("textCurrentlyInDisplay end = \(textCurrentlyInDisplay!)")     
            }
        }

          // make sure we aren't entering a bunch of zero's        
        else { print("else + \(isUserTyping)")

            display.text = digit
            if digit == "0" {return}
            else if digit == "." {display.text = "0."}
            // display.text = (digit == "." ? "0" : "") + digit
            isUserTyping = true
        }

    }

以下是处理numberFormatter的字符串转换的扩展程序。

extension String {
    var twoFractionDigits: String {
        let styler = NumberFormatter()
        styler.minimumFractionDigits = 0
       styler.maximumFractionDigits = 16
       styler.numberStyle = .decimal
        let converter = NumberFormatter()
        converter.decimalSeparator = "."
        if let result = converter.number(from: self) {
            return styler.string(from: result)!
        }
        return ""

    }

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的黑客。它不漂亮,但它的工作原理。我能够让numberFormatter更新并显示小数点后的数字,但这导致了一个新问题。如果您键入12345.00,您将获得12,344,并且在您按下另一个数字之前看不到尾随的0。 ex 12345.1 - > 12,345.1,12345.001 - > 12,345.001,但12345.00 - > 12345。

我需要它动态工作,以便用户知道输入了多少个零。我的黑客是将最终数量分成两个数组。一个预格式化和一个后格式化。然后将两者连接在一起作为最终显示号码。

如果有人有任何想法,我仍然希望找到更有效的解决方案。

这是更新的代码。

@IBAction func btnTouchDigit(_ sender:UIButton){      let digit = sender.currentTitle!

    if isUserTyping {
        preFormattedNumber = (display.text?.replacingOccurrences(of: ",", with: ""))!

        // set the limit for number of digits user can enter at once
        if display.text!.count >= 16 {
            return
        }

        else {
            // make sure we aren't adding a second period
            if digit == "." && ((preFormattedNumber.range(of: ".")) != nil) {

                print("extra decimal pressed")
                return
            }
            else {
                preFormattedNumber = (preFormattedNumber + digit)
                print("preFormattedNumber before Formatting = \(preFormattedNumber)")
            }

            // put code here to format label.text to show thousand seperators
            if ((preFormattedNumber.range(of: ".")) != nil){
                print("just checked for .")
                let numPreFormat = preFormattedNumber
                let numAfterFormat = preFormattedNumber.twoFractionDigits
                let numArray = numPreFormat.components(separatedBy: ".")
                let numArrayFormatted = numAfterFormat.components(separatedBy: ".")
                let afterDecimal = numArray.last
                let beforeDecimal = numArrayFormatted.first
                let finalNumberToDisplay = beforeDecimal! + "." + afterDecimal!
                print("numArray = \(numArray)")
                print("final number to display = \(finalNumberToDisplay)")
                print("numArray = \(numArray)")
                display.text = finalNumberToDisplay
                runningNumber = display.text!
            }
            else {
                display.text = preFormattedNumber.twoFractionDigits
                runningNumber = display.text!
            }
        }
    }

        // make sure we aren't entering a bunch of zero's
    else { print("else + \(isUserTyping)")
        preFormattedNumber = digit
        display.text = preFormattedNumber
        runningNumber = display.text!
        if digit == "0" {return}
        else if digit == "." { preFormattedNumber = "0.";
        }

        display.text = preFormattedNumber
        runningNumber = display.text!
        isUserTyping = true
    }


}