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

How to format a string with a custom dynamic format

我知道 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";

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

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 class,它知道如何格式化其输出值。所以你需要先将 stringInput 转换成 DateTime:

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

第二个示例:同样,您可能想利用 Double class 并再次发生转换:

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

总结这两个例子,您需要知道输入字符串的 类型 ,您在注释中指定的类型 ("string representation of a date")。了解这一点后,您就可以利用每个特定的 class 及其格式化输出字符串的能力。否则很难为自己设计某种通用的格式化程序。一个简单的方法可能如下所示:

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.