public static bool TryParse(string input, IFormatProvider provider, out IsoDuration result, out string errorMessage) { errorMessage = null; var match = IsoRegex.Match(input); bool success = match.Success; if (success) { var duration = new IsoDuration(); bool negative = match.Groups[1].Success; duration.IsNegative = negative; var parser = new ParseField() { IsNegative = negative }; if (errorMessage == null) { parser.TryParse(match.Groups[2].Value, provider, x => { duration.Years = x; }, out errorMessage); } if (errorMessage == null) { parser.TryParse(match.Groups[3].Value, provider, x => { duration.Months = x; }, out errorMessage); } if (errorMessage == null) { parser.TryParse(match.Groups[4].Value, provider, x => { duration.Weeks = x; }, out errorMessage); } if (errorMessage == null) { parser.TryParse(match.Groups[5].Value, provider, x => { duration.Days = x; }, out errorMessage); } if (errorMessage == null) { parser.TryParse(match.Groups[6].Value, provider, x => { duration.Hours = x; }, out errorMessage); } if (errorMessage == null) { parser.TryParse(match.Groups[7].Value, provider, x => { duration.Minutes = x; }, out errorMessage); } if (errorMessage == null) { parser.TryParse(match.Groups[8].Value, provider, x => { duration.Seconds = x; }, out errorMessage); } if (errorMessage == null) { result = duration; success = true; } else { result = default(IsoDuration); success = false; } } else { result = default(IsoDuration); } return(success); }