UITextField 货币格式从左到右

Posted

技术标签:

【中文标题】UITextField 货币格式从左到右【英文标题】:UITextField Currency Format Left to Right 【发布时间】:2018-12-07 15:36:14 【问题描述】:

我想在输入金额时将我的 UITextField 格式化为左侧有一个 $

到目前为止,我的代码所做的是当我输入时让 $5.65 这就是它的输入方式:$0.05 -> $0.56 -> $5.65

我希望它不是从右到左而是从左到右,所以像这样:$5 -> $5. -> $5.6 -> $5.65

但我想限制它只有两位小数,美元符号在左边,你不能输入任何其他字符(例如:!、@、#、$、%、^、A-Z' )

这是我目前拥有的:

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
    amuTextField.text = finalString.currency

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


func currencyInputFormatting() -> String 

    var number: NSNumber!
    let formatter = NumberFormatter()
    formatter.numberStyle = .currencyAccounting
    formatter.currencySymbol = "$"
    formatter.maximumFractionDigits = 2
    formatter.minimumFractionDigits = 2

    var amountWithPrefix = self

    // remove from String: "$", ".", ","
    let regex = try! NSRegularExpression(pattern: "[^0-9]", options: .caseInsensitive)
    amountWithPrefix = regex.stringByReplacingMatches(in: amountWithPrefix, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count), withTemplate: "")

    let double = (amountWithPrefix as NSString).doubleValue
    number = NSNumber(value: (double / 100))

    return formatter.string(from: number)!

【问题讨论】:

删除/ 100,您可能会得到大部分想要的东西。 我拿走了/ 100 并将最小和最大分数数字更改为 0 并接近但我无法添加小数 您可能需要特别检查当前字符串是否以. 结尾,然后在格式化后,将. 添加回结果末尾。 你能给我举个例子,说明我应该如何使用我当前的函数和变量来解决这个问题 【参考方案1】:

您可以使用它来限制. 之后的小数位:

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

      guard let oldText = textField.text, let r = Range(range, in: oldText) else 
        return true
      

      let newText = oldText.replacingCharacters(in: r, with: string)
      let isNumeric = newText.isEmpty || (Double(newText) != nil)
      let numberOfDots = newText.components(separatedBy: ".").count - 1

      let numberOfDecimalDigits: Int
      if let dotIndex = newText.firstIndex(of: ".") 
        numberOfDecimalDigits = newText.distance(from: dotIndex, to: newText.endIndex) - 1
       else 
        numberOfDecimalDigits = 0
      

      return isNumeric && numberOfDots <= 1 && numberOfDecimalDigits <= 2
  

【讨论】:

以上是关于UITextField 货币格式从左到右的主要内容,如果未能解决你的问题,请参考以下文章

如何让 div 的内容从左到右,然后 drop e 继续从左到右

jQuery FadeIn 从左到右

UIImageView从左到右改变动画

核心动画从左到右

从左到右平滑地重复动画

从左到右读取对象