我可以在Swift中使用多个分隔符分割一个数字string吗?
我有一个分数和十进制数字的string数组。
let stringArray = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"]
每个数组元素都映射到一个闭包,其中的数字是从string中提取的。
let values = stringArray.map { s -> Double in
任何分数(见前面的文章 )
let splitStrings = s.characters.split(separator: "/").map(String.init).map({ Double($0) })
或十进制
let splitStrings = s.characters.split(separator: ".").map(String.init).map({ Double($0) })
问题 :在Swift中有一种方法可以使用多个分隔符来分割string,所以一个闭包可以返回小数值或小数值吗?
(继续closures)
switch (token)) { case "/" : print( "fraction") let pathA = splitString[0]!/splitString[1]! return pathA case "." : print( "decimal") let upperSplit = splitString[0]! let lowerSplit = splitString[1]! * 0.1 // restore decimal point let pathB = upperSplit+lowerSplit return pathB } }
如果您的目的是从十进制表示或分数中创build浮点数,则不需要在小数点处拆分string。
您可以尝试使用Double(string)
来转换string,如果失败,则将其拆分为斜杠并分别转换分子和分母:
func doubleFromDecimalOrFraction(s: String) -> Double? { // Try to convert from decimal representation: if let value = Double(s) { return value } // Try to convert from fractional format: if let range = s.range(of: "/"), let num = Double(s.substring(to: range.lowerBound)), let den = Double(s.substring(from: range.upperBound)) { return num/den } // Invalid format return nil }
(而不是为无效input返回nil
,你也可以考虑throw
一个错误,用fatalError()
中止执行,或返回一些默认值。
这个“效用函数”可以应用于每个数组元素:
let strings = [ "0.0", "193.16", "5/4", "503.42", "696.58", "25/16", "1082.89", "2/1"] let values = strings.flatMap(doubleFromDecimalOrFraction)
由多个分隔符分割
使用字符
Swift 3
let s = "[0, 1, 2, 1]" let splitted = s.characters.split { [",", "[", "]"].contains(String($0)) }
Swift 2
let s = "[0, 1, 2, 1]" let splitted = s.characters.split(isSeparator: {[",", "[", "]"].contains($0)}) }
使用characterSet
Swift 3
let str = "[0, 1, 2, 1]" let separatorSet = CharacterSet(charactersInString: ",[]") let comps = str.components(separatedBy: separatorSet)
Swift 2
let str = "[0, 1, 2, 1]" let separatorSet = NSCharacterSet(charactersInString: ",[]") let comps = str.componentsSeparatedByCharactersInSet(separatorSet)
不pipe用什么方法,结果你都会收到数组。 没有信息,使用哪个分隔符
如果你只需要将string转换为doble
let array = stringArray .flatMap { element in if let value = Double(element) { return value } let parts = element.components(separatedBy: "/") guard parts.count == 2, let dividend = Double(parts[0]), let divisor = Double(parts[1]), divisor != 0 else { return nil } return dividend / divisor }