Определение, является ли строка датой или числом - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно надежно определить, является ли введенная пользователем строка датой или числом.

Рассмотрим строку 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.

И да, мы знаем язык / культуру пользователя при этомрасчет, но решение должно работать во всех культурах.

1 Ответ

0 голосов
/ 19 октября 2018

Я полагаю, что ваш текущий подход (формализация ваших логических требований и правил приоритета в пользовательском синтаксическом анализаторе) - правильное решение, если вам нужно, чтобы C # вел себя как Excel.C # не является Excel и не имеет встроенных требований или логики, чтобы заставить его вести себя аналогичным образом.

Мои два цента: если я писал C # API для работы с данными Excel, вместо того, чтобы следовать Правила синтаксического анализа в Excel, я бы следовал правилам синтаксического анализа в C # (или более строгим правилам с применением некоторой логики, применяемой там, где это необходимо) и записывал только data в файл Excel.Это позволяет избежать попыток имитировать неконтролируемую систему и не наносит ущерба правильности полученной книги.

...