【问题标题】:Swift String contain , or . but not bothSwift 字符串包含 , 或 .但不是两者
【发布时间】:2021-08-07 01:41:54
【问题描述】:

我想用更优雅的方式写出以下内容:

let number = "1,2922.3"

if number.contains(",") || number.contains(".") && !(number.contains(".") && number.contains(",")) {
    // proceed
}

也就是说,如果数字有“。”,我想继续。或“,”,但不能同时使用。

一定有更好的方法吗?

我不想使用扩展,因为它在我的代码中的一个地方。

【问题讨论】:

  • 您应该使用扩展程序。扩展专门针对代码中的单个位置。始终使用扩展名。 (在某些情况下使用函数代替,但通常是扩展。)
  • @Fattie 我不认为那是意图。 OP 声明不想添加扩展,因为这只是一次性检查 - 他们不想全面扩展一个类 扩展向现有类、结构、枚举添加新功能, 或协议类型。 Extension
  • ?你只需使用 fileprivate
  • 有时越简单越好!该代码确实没有任何问题,因此不清楚您为什么要简化它。请注意,有一个轻微的逻辑错误,因为您希望将 OR 组合在一起进行评估,例如 ( number.contains(",") || number.contains(".") ) && !( number.contains(".") && number.contains(",") )。因此,现在读取的字符串包含 ( . OR , ) 并且不包含两者。这使得第一部分评估为 true if 或 。
  • 这似乎很接近验证数字格式。您对“正确格式”的想法可能是错误的,因此请谨慎行事。

标签: swift


【解决方案1】:

你可以使用SetAlgebra:

func validate(_ string: String) -> Bool {
    let allowed = Set(",.")
    return !allowed.isDisjoint(with: string) && !allowed.isSubset(of: string)
}

validate("1,2922.3") // false
validate("1,29223") // true
validate("12922.3") // true
validate("129223") // false

稍微解释一下:

  • !allowed.isDisjoint(with: string),因为您想排除既不包含 . 又不包含 , 的字符串。
  • !allowed.isSubset(of: string),因为您要排除同时包含 ., 的字符串。

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2014-11-15
    • 2021-09-26
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2018-09-06
    相关资源
    最近更新 更多