如何使用自定义动态格式格式化字符串
本文关键字:格式化 字符串 格式 动态 何使用 自定义 | 更新日期: 2023-09-27 18:14:01
我知道string.Format
和ToString()
可以对字符串应用格式化,
我甚至不确定这是否可能,所以任何提示都是受欢迎的。我还没有能够应用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
。