public static bool DiapasonContains([NotNull] this string s, double value, bool roundSingle = true) {
if (s == null) throw new ArgumentNullException(nameof(s));
return s.Split(',', ';').Select(x => x.Trim()).Any(part => {
var n = part.IndexOf('-');
if (n == 0) {
var m = part.IndexOf('-', n + 1);
if (m != -1 && m != 1) {
n = m;
}
}
double fromValue, toValue;
if (n > 0 && n < part.Length - 1) { // "x-y"
if (FlexibleParser.TryParseDouble(part.Substring(0, n), out fromValue) &&
FlexibleParser.TryParseDouble(part.Substring(n + 1), out toValue)) {
return value >= fromValue && value <= toValue;
}
} else if (n < 0) { // "x"
if (FlexibleParser.TryParseDouble(part, out fromValue)) {
return roundSingle ? value.RoughlyEquals(fromValue) : Equals(fromValue, value);
}
} else if (part.Length == 1) { // "-"
return true;
} else if (n == part.Length - 1) { // "x-"
if (FlexibleParser.TryParseDouble(part.Substring(0, n), out fromValue)) {
return value >= fromValue;
}
} else { // "-x"
if (FlexibleParser.TryParseDouble(part.Substring(n + 1), out toValue)) {
return value <= toValue;
}
}
return false;
});
}