2015-09-22 76 views
0

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

如果您添加值和格式的示例,问题会更加清晰 – ASh

+0

给我们提供一些数据示例 – rbm

+2

*“因为这些要求您现场声明您想要的格式和我的动态”*不是,他们需要字符串,它不需要内联定义,'string.Format(formatFromDb,valueFromDb)'应该工作得很好。 –

回答

2

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相应地处理这种情况下您的需求。

后来编辑所需的例子之后被张贴:

第一个例子:你可能想利用DateTime类的从C#哪知道来格式化它的输出值。所以,你首先需要stringInput转换成日期时间:

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

+0

你的例子并没有真正格式化字符串,更像是连接它们。对于我想要的,{1}将是一个格式字符串(而不是常规字符串)。 我添加了两个输出示例,请看看他们 – sergio

+0

我根据您的示例编辑了答案,还匹配您关于转换回数据类型然后再转换为字符串的想法。 – tomab