如何验证.NET格式字符串?

时间:2014-04-10 19:29:53

标签: c# validation string-formatting

我开发了一个C#解决方案,要求用户可以自定义显示的实数格式,包括标题,数字和单位。

我允许用户指定一个与string.Format()的第一个参数完全匹配的格式字符串,这样他就可以按照自己想要的方式调整显示。

例如,{0}: {1:0.00} [{2}]会显示Flow rate: 123.32 [Nm³/h]

用户知道如何使用此格式化功能,{0}是标题,{1}是数字,{2}是数字,并且具有关于.NET格式化所需的最少知识。

但是,在某些时候我必须验证他输入的格式字符串,除了将它用于伪值并以这种方式捕获FormatException之外我没有找到其他方法:

try
{
    string.Format(userFormat, "", 0d, "");

    // entry acceptance...
}
catch(FormatException)
{
    messageBox.Show("The formatting string is wrong");

    // entry rejection...
}

发生错误时,这不是最方便用户的......

可以更优雅的方式验证.NET格式字符串吗?是否有办法在发生故障时向用户提供一些提示?

2 个答案:

答案 0 :(得分:1)

很可能更好并且更有效地实现此目的。这只是一种可能的方式。

但这是我想出来的。

public bool IsInputStringValid(string input)
    {
        //If there are no Braces then The String is vaild just useless
        if(!input.Any(x => x == '{' || x == '}')){return true;}

        //Check If There are the Same Number of Open Braces as Close Braces
        if(!(input.Count(x => x == '{') == input.Count(x => x == '}'))){return false;}

        //Check If Value Between Braces is Numeric

        var tempString = input; 

        while (tempString.Any(x => x == '{'))
        {
            tempString = tempString.Substring(tempString.IndexOf('{') + 1);
            string strnum = tempString.Substring(0, tempString.IndexOf('}'));

            int num = -1;
            if(!Int32.TryParse(strnum, out num))
            {
                    return false;
            }       
        }

        //Passes Validation
        return true;
    }

这是小提琴:http://dotnetfiddle.net/3wxU7R

答案 1 :(得分:0)

你试过了吗?

catch(FormatException fe)
{
     messageBox.Show("The formatting string is wrong: " + fe.Message);

// entry rejection...
}