如何使用自定义动态格式格式化字符串
How to format a string with a custom dynamic format
我知道 string.Format
和 ToString()
可以将格式应用于字符串,
在我的例子中,我有一个带有值的字符串(通常它会有一个数据的字符串表示,但可以有其他基本数据类型的字符串表示),我有另一个表示所需格式的字符串。这些值来自数据库,我需要的是将一个应用到另一个
我什至不确定这是否可行,因此欢迎任何指点。我无法应用任何版本的 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
.
我知道 string.Format
和 ToString()
可以将格式应用于字符串,
在我的例子中,我有一个带有值的字符串(通常它会有一个数据的字符串表示,但可以有其他基本数据类型的字符串表示),我有另一个表示所需格式的字符串。这些值来自数据库,我需要的是将一个应用到另一个
我什至不确定这是否可行,因此欢迎任何指点。我无法应用任何版本的 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
.