如何使用自定义动态格式格式化字符串

时间:2015-09-22 13:53:27

标签: c# .net string string-formatting

我知道string.FormatToString()可以将格式应用于字符串

在我的情况下,我有一个带有值的字符串(通常它将具有数据的字符串表示,但可以具有其他基本数据类型的字符串表示),并且我有另一个表示所需格式的字符串。这些值来自数据库,我需要的是将一个应用于另一个

我甚至不确定这是否可行,所以任何指针都是受欢迎的。我还没有能够应用任何版本的ToString或Format。因为这些要求您在现场声明您想要的格式,并且我的是动态的

是否有一些像tryParse这样的格式化方法(从某种意义上说它会尝试对它给出的数据进行任何可能的格式化?

编辑:请求的一些例子:

 stringInput = "Jan 31 2012"; //string representation of a date
 inputFormat="dd/MM/yyyy, HH mm"
 outputString = "31/Jan/2015, 00:00";

 stringInput = "100"; //string representation of a number
 inputFormat="D6"
 outputString = "000100";

1 个答案:

答案 0 :(得分:2)

string.Format(string, string)需要2个字符串参数,因此您可以从db中获取它们并直接应用它们:

string formatToApply = "{0} and some text and then the {1}";
string firstText = "Text";
string secondText = "finsh.";

// suppose that those strings are from db, not declared locally
var finalString = string.Format(formatToApply, firstText, secondText);
// finalString = "Text and some text and then the finish."

然而,错误的说明符数量或错误的参数数量存在很大的风险。如果您有这样的调用,它将抛出异常:

var finalString = string.Format(formatToApply, firstText);
//An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll; 
//Additional information: Index (zero based) must be greater than or 
//equal to zero and less than the size of the argument list.

所以请将您的电话打包到try/catch/ (maybe) finally以根据您的需要处理这种情况。

稍后编辑了所需的示例后发布:

第一个例子:您可能希望利用C#中的DateTime类来知道格式化其输出值。因此,您首先需要将stringInput转换为DateTime:

var inputDateTime = DateTime.Parse(stringInput);
var outputString = inputDateTime.ToString(inputFormat);

第二个例子:再次,您可能想要利用Double类并再次进行转换:

var inputDouble = Double.Parse(stringInput);
var outputString = inputDouble.ToString(inputFormat);

总结这两个例子,你需要知道输入字符串的类型,你在评论中指定的类型(“日期的字符串表示”)。了解这一点,您可以利用每个特定的类及其格式化输出字符串的能力。否则,很难设计自己某种通用的格式化程序。一个简单的方法可能如下所示:

public string GetFormattedString(string inputString, string inputFormat, string type)
{
    switch (type)
    {
        case "double":
            var inputDouble = Double.Parse(inputString);
            return inputDouble.ToString(inputFormat);
            break;
        case "datetime":
            var inputDateTime = DateTime.Parse(inputString);
            return inputDateTime.ToString(inputFormat);
            break;
        case "...": // other types which you need to support
        default: throw new ArgumentException("Type not supported: " + type);
    }
}

这个switch只是对逻辑如何发生的一个想法,但你需要处理Parse方法和ToString方法的错误,如果有许多类型需要支持,更好地利用Factory等一些设计模式。