Мне нужно надежно определить, является ли введенная пользователем строка датой или числом.
Рассмотрим строку 1.1
.Эта строка успешно анализирует значение типа double с использованием
double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out var result)
Эта строка также успешно анализирует значение DateTime с использованием значения
DateTime.TryParse(s, out var dResult)
. Нам нужно, чтобы эта строка интерпретировалась как double на английском языке.
Больше сложностей возникает, если учесть другие культуры.
Например, в немецком языке NumberGroupSeperator и DateSeperator представляют собой точки, а не запятую и косую черту, как в английском языке.Таким образом, на немецком языке строка 1.1
должна фактически анализироваться на DateTime (то есть: 1 января текущего года).Единственный способ узнать это программно - это проверить NumberGroupSeperator и NumberGroupSizes (потому что строка 1.1
на немецком языке эквивалентна 1,1
на английском, что, как мы знаем, не должно анализироваться как двойное или целое, потому что NumberGroupSeperator (запятая) находится не в том месте).
Из чтения документации ( и этого сверхпассивного агрессивного разговора о проблеме GitHub ) у .NET нет способа фактически проверить NumberGroupSeperator и NumberGroupSizes при разборе.
Кто-нибудь сталкивался с этой проблемой раньше и как вы ее решили?
Я написал некоторый код для ручной проверки NumberGroupSeperator и NumberGroupSizes, но, похоже, должен быть лучший способ.Я могу поделиться этим кодом, если кому-то интересно.
РЕДАКТИРОВАТЬ
Для тех из вас, кто просит больше информации о бизнес-проблеме.Я работаю над проектом с открытым исходным кодом, который позволяет пользователям редактировать электронные таблицы Excel через AC # API.Представьте, что кто-то вводит строку «1.1» в ячейку A1 и строку «1» в ячейку B1, а затем использует эту библиотеку с открытым исходным кодом, чтобы попытаться вычислить формулу = A1 + B1 в другой ячейке. Этот проект должен точно соответствовать Microsoft Excel .Таким образом, если мы находимся в языке / культуре, где «1.1» интерпретируется как дата, то результатом этого добавления должна стать дата OAD от 1 января 2018 года плюс один (т.е.: 43101 + 1 = 43102).Но если мы находимся на языке, где «1.1» - это число 1.1, то результатом этого вычисления должно быть 1,1 + 1 = 2,1.
И да, мы знаем язык / культуру пользователя при этомрасчет, но решение должно работать во всех культурах.