Ваша проблема в вашей третьей группе захвата.? Вам нужно экранировать точку, иначе он будет интерпретирован как любой символ:
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})$"