是否有自定义解析服务提供程序,如反IFormatProvider?

时间:2012-02-10 08:03:50

标签: c# .net winforms parsing

我有几个TextBox,它们显示角度值。我使用IFormatProvider的不同自定义实现格式化这些格式,例如:值1.5707963267949可以显示为1.57079632679490.5π90°。 TextBoxes是单向数据绑定,我通过处理绑定的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在相反的方向?或者你会建议一个不同的方法?

根据我的理解,我无法在Convert.ToDouble Method (String, IFormatProvider)中使用我的IFormatProviders,因为要确定要解析的数字的格式,它只使用NumberFormatInfo - {返回的对象{1}},我显然无法用它来指定必要的信息。

谢谢!

richn

2 个答案:

答案 0 :(得分:1)

不,那是不可能的。我认为主要是因为一般情况下不可能从格式化程序中自动推导出解析器(即iirc,由方法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事件。

答案 1 :(得分:0)

您可以将原始值存储在某种容器/词典中。当您将其设置为格式化的文本框时,然后当您想要原始值时,再次从字典中提取。

e.Value = String.Format(this.angleValueFormat, "{0:0.###}", MyValues["ValueName"];