在操场上使用以下代码,我的测试字符串“ 23a”与我的测试匹配,我不确定为什么。
extension String {
var isCurrencyString: Bool {
return currencyString == self
}
var currencyString: String {
let input = self as NSString
guard let decimalSeparator = NSLocale.current.decimalSeparator
, let groupingSeparator = NSLocale.current.groupingSeparator
else { return "" }
let testPattern = "^-?([0-9]{1,3}(\(groupingSeparator)?[0-9])*)(\(decimalSeparator)?[0-9]{0,2})$"
guard let expression = try? NSRegularExpression(pattern: testPattern) else { return "" }
let matches = expression.matches(in: self, options: [], range: NSMakeRange(0, input.length)).map {
input.substring(with: $0.range)
}
return matches.first ?? ""
}
}
let tester = "23a"
print(tester.currencyString) //23a
print(tester.isCurrencyString) //true
答案 0 :(得分:1)
您的问题出在您的第三个捕获小组。您需要转义该句点,否则它将被解释为任何字符:
guard
var decimalSeparator = NSLocale.current.decimalSeparator,
var groupingSeparator = NSLocale.current.groupingSeparator
else { return "" }
if groupingSeparator == "." { groupingSeparator = #"\."# }
if decimalSeparator == "." { decimalSeparator = #"\."# }
您还应该将第二个捕获组中的位数设置为3
尝试
let testPattern = "^-?([0-9]{1,3}(\(groupingSeparator)?[0-9]{3})*)(\(decimalSeparator)?[0-9]{0,2})$"