【问题标题】:Swift 3 Trimming charactersSwift 3 修剪字符
【发布时间】:2017-09-10 10:51:43
【问题描述】:

有人知道如何修剪或消除字符串中的字符吗?我有来自 UIlabel 的数据,例如“ABCDE1000001”,我只需要获取数字。任何的想法?修剪?连接?还有其他解决方案吗?

我也尝试过,但正在寻找其他解决方案

 let cardtrim = String.trimmingCharacters(in: CharacterSet(charactersIn: "ABCDEF"))

【问题讨论】:

  • 如果输入是 A1B2C3???? 怎么办?如果根本没有数字怎么办?
  • 检查我的解决方案,它会过滤除数字之外的所有内容。

标签: swift swift3 trim


【解决方案1】:

您的代码运行良好,但您需要在存储要修剪的值的 String 变量上调用它。

let stringToTrim = "ABCDE1000001"
let cardtrim = stringToTrim.trimmingCharacters(in: CharacterSet(charactersIn: "ABCDEF")) //value: 1000001

更通用的解决方案是使用CharacterSet.decimalDigits.inverted 仅保留字符串中的数字。

let cardtrim = stringToTrim.trimmingCharacters(in: CharacterSet.decimalDigits.inverted)

请注意,trimmingCharacters 仅从字符串的开头和结尾删除字符集中的字符,因此如果您有类似 ABC101A101 的字符串并希望从中删除所有字母,则必须使用一种不同的方法(例如正则表达式)。

【讨论】:

  • 不是最好的解决方案。在不同的语言环境中,您不知道“十进制数字”可能是什么。例如 - 它是否包括“。” ?
  • @Fattie CharacterSet 使用 Unicode 规范,因此它的所有子集都是独立于语言环境的 AFAIK。
  • @DávidPásztor,您知道我真的很欣赏您所说的话 - 但在现实世界的实际团队情况中,这只是太冒险了。事实是,你只是想要这个 .. "[^0-9]" 所以最好的办法就是输入它。你知道,在许多情况下,Apple 完全搞砸了 ISO 实施。而且标准可能会改变 - 无论如何。
【解决方案2】:

试试这个而不是硬编码charactersIn,这是一个动态的解决方案,它适用于strings 的其他变体,而不仅仅是ABCDEF

extension String {

    var numbersOnly: String {

        let numbers = self.replacingOccurrences(
             of: "[^0-9]",
             with: "",
             options: .regularExpression,
             range:nil)
        return numbers
    }
}

let string = "A77BC66DE1001".numbersOnly // 77661001

【讨论】:

  • 您应该考虑使用类似的东西而不是硬编码值。如果您的字符串看起来不同,那么您的代码将无法正常工作。
  • @PenRueda,np。你改变了接受的答案,为什么我可以问。
  • 我确实试过了,但没用。所以现在我使用了其他解决方案
  • @PenRueda,什么没用?创建一个新类并将其命名为 Extensions 在其中添加扩展名,然后在您想要执行此操作的所有字符串上添加扩展名,只需在任何类上调用 .numbersOnly
  • 这是这里唯一真正的解决方案。其他一切都很愚蠢。
【解决方案3】:

你必须得到 Swifty:

let string = "ABC12DE100YU0001".filter { ("0"..."9").contains($0) }

在扩展中:

extension String {

    func filterLetters() -> String {
        return filter { ("0"..."9").contains($0) }
    }
}

【讨论】:

    【解决方案4】:

    考虑trimmingCharacters 仅删除与字符集匹配的(连续)前导或尾随字符。

    要删除字符串中的所有个非数字字符,我建议使用正则表达式

    let string = "ABC12DE100YU0001"
    let trimmedString = string.replacingOccurrences(of: "\\D", with: "", options: .regularExpression)
    // -> "121000001"
    

    更新:

    在 Swift 5+ 中有一种更有效的方法:

    let string = "ABC12DE100YU0001"
    var trimmedString = string
    trimmedString.removeAll{ !$0.isNumber }
    // -> "121000001"
    

    【讨论】:

      【解决方案5】:

      此扩展程序将返回字符串中的数字,这正是您所需要的

      extension String {
      
          var digits: String {
              return components(separatedBy: CharacterSet.decimalDigits.inverted)
                  .joined()
          }
      }
      

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多