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

本文关键字:格式化 字符串 格式 动态 何使用 自定义 | 更新日期: 2023-09-27 18:14:01

我知道string.FormatToString()可以对字符串应用格式化,

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

我甚至不确定这是否可能,所以任何提示都是受欢迎的。我还没有能够应用ToString或格式的任何版本。因为这些要求你当场声明你想要的格式我的是动态的

是否有一些格式化方法,如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个字符串参数,所以你可以从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