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

标签 ios swift numberformatter

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

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

我向 IBAction 展示了覆盖显示标签上显示的按钮的代码,display.text 这就是问题所在。此后的所有计算都工作正常,使用 replacingOccurrences(of: ",", with: "") 创建一个干净的字符串以转换为 Double 并计算。

我正在使用 sting 扩展来进行格式化。我已经断断续续地为此工作了好几个星期。有任何想法吗?我是否必须重构在 label.text 中输入文本的方式?

这里是将文本添加到 UILabel 显示 的代码。

@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 ""

    }

最佳答案

我找到了一个解决我的问题的方法。它不漂亮,但很有效。我能够让 numberFormatter 更新并显示小数点后的数字,但这导致了一个新问题。如果您输入 12345.00,您将得到 12,344,并且在您按下另一个数字之前看不到尾随的 0。例如 12345.1 -> 12,345.1、12345.001 -> 12,345.001,但 12345.00 -> 12,345。

我需要它动态工作,以便用户知道输入了多少个零。我的技巧是将最终金额分成两个数组。一种是预格式化的,另一种是后格式化的。然后将两者连接在一起以获得最终的显示编号。

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

这是更新后的代码。

@IBAction func btnTouchDigit(_ 发送者: UIButton) { 让数字 = 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
    }


}

关于ios - 数字格式化程序不允许显示小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45891741/

相关文章:

ios - 避免在 View 中再次获取图像

ios - 使用一年中的一周检查 NSDate 是否在当前周

ios - 在起点画一个矩形,然后按照我的 Action 在 Swift 中结束手势

nsstring - stringByReplacingCharactersInRange 如何快速工作?

java - 将 DecimalFormat 与自定义模式一起使用,但没有区域设置格式

ios - 在容器 View 中播放本地视频 Swift 4

ios - AVAudioSessionDelegate 在 endInterruption 时调用,但未调用 beginInterruption

ios - 无法使用 Swift 对 UITextField 上的对象进行正则表达式匹配

java - 在将格式应用到 JFormattedTextField 后是否有强制验证的方法?