对于Swift中的字符,isDigit()的替换是什么?

Ale*_*ell 22 swift

正如提到的这个帖子,之前的Xcode 6 Beta 4的,可以使用c.isDigit(),并c.isAlpha()找到,如果c : Character是一个数字或字母.帖子提到这被删除,因为它只对ASCII字符有效.

我的问题是,什么是替代品?如果没有使用用于字母数字选项的switch语句设置函数,我该如何测试其数字上的字符?

Mar*_*n R 64

"问题"是Swift字符不直接对应于Unicode代码点,而是表示"扩展字形集群",它可以包含多个Unicode标量.例如

let c : Character = "" // REGIONAL INDICATOR SYMBOL LETTERS US
Run Code Online (Sandbox Code Playgroud)

实际上是两个 Unicode标量的序列.

如果我们忽略这个事实,那么你可以检索字符的初始 Unicode标量(比较如何获得字符的Unicode代码点?)并测试其在字符集中的成员资格:

let c : Character = "5"

let s = String(c).unicodeScalars
let uni = s[s.startIndex]

let digits = NSCharacterSet.decimalDigitCharacterSet()
let isADigit = digits.longCharacterIsMember(uni.value)
Run Code Online (Sandbox Code Playgroud)

这对于字符"0"..."9"返回"true",但实际上对于"十进制数字类别"的所有 Unicode标量,例如:

let c1 : Character = "?" // BENGALI DIGIT NINE U+09EF
let c2 : Character = "" // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE U+1D7D9
Run Code Online (Sandbox Code Playgroud)

如果你只关心(ASCII)数字"0"..."9",那么最简单的方法可能是:

if c >= "0" && c <= "9" { }
Run Code Online (Sandbox Code Playgroud)

或者,使用范围:

if "0"..."9" ~= c { }
Run Code Online (Sandbox Code Playgroud)

  • 太棒了.谢谢! (3认同)

小智 8

Swift 3似乎更容易一些:

let str = "abcdef12345"
let digitSet = CharacterSet.decimalDigits

for ch in str.unicodeScalars {
    if digitSet.contains(ch) {
        // is digit!
    }
}
Run Code Online (Sandbox Code Playgroud)


Ima*_*tit 7

使用Swift 5,您可以根据需要选择以下方式之一来解决问题。


#1。使用CharacterisNumber属性

角色具有称为的属性isNumberisNumber具有以下声明:

var isNumber: Bool { get }
Run Code Online (Sandbox Code Playgroud)

一个布尔值,指示此字符是否代表数字。

下面的Playground示例代码显示了如何使用以下方法检查字符是否代表数字isNumber

let character: Character = "9"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
print(character.isNumber) // false
Run Code Online (Sandbox Code Playgroud)

#2。使用CharacterisWholeNumber属性

如果要检查字符是否代表整数,可以使用CharacterisWholeNumber属性:

let character: Character = "9"
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)

#3。使用Unicode.Scalar.PropertiesgeneralCategory属性和Unicode.GeneralCategory.decimalNumber

下图显示了样品游乐场代码如何检查如果一个字符的第一个Unicode标是使用十进制数generalCategoryUnicode.GeneralCategory.decimalNumber

let character: Character = "9"
let scalar = character.unicodeScalars.first! // DIGIT NINE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
let scalar = character.unicodeScalars.first! // VULGAR FRACTION ONE HALF
print(scalar.properties.generalCategory == .decimalNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first! // CIRCLED DIGIT FOUR
print(scalar.properties.generalCategory == .decimalNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
let scalar = character.unicodeScalars.first! // DIGIT ONE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
let scalar = character.unicodeScalars.first! // DIGIT ONE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first! // BENGALI DIGIT NINE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
let scalar = character.unicodeScalars.first! // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
let scalar = character.unicodeScalars.first! // LATIN CAPITAL LETTER F
print(scalar.properties.generalCategory == .decimalNumber) // false
Run Code Online (Sandbox Code Playgroud)

#4。使用Unicode.Scalar.PropertiesgeneralCategory属性和Unicode.GeneralCategory.otherNumber

同样,你可以检查一个字符对应的第一个Unicode标到类别Other_Number Unicode标准使用generalCategoryUnicode.GeneralCategory.otherNumber

let character: Character = "9"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)

#5。使用CharacterSetdecimalDigits属性

或者,可以导入Foundation并检查是否CharacterSet.decimalDigits包含字符的第一个Unicode标量:

import Foundation

let character: Character = "9"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = "½"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // false
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // false
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = "1?"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = "1??"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = ""
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation

let character: Character = "F"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // false
Run Code Online (Sandbox Code Playgroud)

#6。使用Unicode.Scalar.PropertiesnumericType

Apple文档指出numericType

对于表示数字的标量,numericType是标量的数字类型。对于所有其他标量,此属性为nil

以下示例代码示出了可能的数值类型(decimaldigitnumeric对于给定字符的第一个标量):

let character: Character = "9"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.numeric)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.digit)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // nil
Run Code Online (Sandbox Code Playgroud)