Существует ли пользовательский поставщик услуг парсинга, например, обратный IFormatProvider? - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть несколько TextBox, которые отображают угловые значения.Я форматирую их, используя различные пользовательские реализации IFormatProvider, например: значение 1.5707963267949 может отображаться как 1.5707963267949, 0.5π или 90°.Текстовые поля имеют одностороннюю привязку к данным, и я выполняю форматирование, обрабатывая событие Format привязки:

void bindingToMyTextBox_Format(object sender, ConvertEventArgs e)
{
    // angleValueFormat is one of a few a custom implementations of 
    // IFormatProvider performing the actual formatting work.
    e.Value = String.Format(this.angleValueFormat, "{0:0.###}", (double)e.Value);
}

Я хочу разрешить пользователю вводить значения в том же формате, в котором они отображаютсяв. Так что мне нужно проанализировать TextBox.Text, чтобы получить исходное значение 1.5707963267949.Есть ли какой-нибудь интерфейс "IParserProvider", предоставляющий услуги парсинга, например IFormatProvider в противоположном направлении?Или вы бы предложили другой подход?

Из того, что я понимаю, я не могу использовать свои IFormatProviders в методе Convert.ToDouble (String, IFormatProvider) , потому что для определения, в каком формате находится число для разбора, он используеттолько NumberFormatInfo -объект, возвращаемый IFormatProvider.GetFormat(), который я явно не могу использовать для указания необходимой информации.

Спасибо!

richn

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Нет, это невозможно.Я думаю, в основном потому, что в общем случае невозможно автоматически определить синтаксический анализатор из средства форматирования (которое внутренне реализовано методом ICustomFormatter.Format).

Я бы предложил определить собственный интерфейс

public interface IAngleParser {
    double ParseAngle(string);
}

и реализуйте его в своих классах для angleValueFormat mamber.Возможно, вам придется использовать некоторые регулярные выражения или около того, чтобы сделать это.

Тогда вы можете использовать

void bindingToMyTextBox_Parse(object sender, ConvertEventArgs e) {
    e.Value = ((IAngleParser)this.angleValueFormat).ParseAngle(e.Value);
}

и связать это с событием Parse вашей привязки.

0 голосов
/ 10 февраля 2012

Вы можете хранить свои исходные значения в каком-то контейнере / словаре.Когда вы устанавливаете его в текстовое поле, вы форматируете его, а затем, когда вам нужно исходное значение, вы снова извлекаете его из словаря.

e.Value = String.Format(this.angleValueFormat, "{0:0.###}", MyValues["ValueName"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...