2010-11-04 88 views
1

所以我想字符串转换是这样的:有没有办法在C#/。NET 2.0中为C#格式字符串转换C格式字符串?

"Bloke %s drank %5.2f litres of booze and ate %d bananas" 

用C#等效.Format或.AppendFormat方法

"Bloke {0} drank {1,5:f2} litres of booze and ate {2} bananas" 

抱歉,但我不知道如果C#版本是正确的但你明白了。该解决方案不一定非常完美,但涵盖了基本情况。

感谢& BR -Matti

回答我的其他问题How to write C# regular expression pattern to match basic printf format-strings like "%5.2f"?

+0

基于字符串搜索和替换的解决方案如何? – 2010-11-04 14:08:28

+0

任何相当快的东西!大多数字符串没有这些C占位符,所以当有0个C占位符时它应该很快。这绝对不是微不足道的,我想知道解决方案是否已经存在,因为这可能是常见问题。 – 2010-11-04 14:13:11

+0

OP与此类似的问题:[如何编写C#正则表达式模式来匹配基本的printf格式字符串,例如“%5.2f”?](http://stackoverflow.com/questions/4098533/) – 2010-11-04 16:26:52

回答

0

你很可能只是用StringBuilder.Replace()

StringBuilder cString = new StringBuilder("Bloke %s drank %5.2f litres of booze and ate %d bananas"); 
cString.Replace("%s","{0}"); 
cString.Replace("%5.2f", "1,5:f2"); // I am unsure of this format specifier 
cString.Replace("%d", "{2}"); 

string newString = String.Format(cString.ToString(), var1, var2, var3); 

可以想象,你可以添加这样的事情作为一个扩展方法的字符串,但我觉得你最大的问题将是在特殊格式符。如果在这方面不重要,则可能需要设计一个正则表达式来捕获这些表达式并进行有意义的替换。

+0

如果这是这么简单,我不会问:http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/ – 2010-11-04 14:28:11

+0

这是一个例子。因此“convert string _like_ this”。 – 2010-11-04 14:31:25

+4

-1:这是针对无法硬编码的问题的硬编码解决方案。一个工作解决方案将比这更复杂。 – Brian 2010-11-04 14:32:21

0

首先尝试:此(有点)忽略一个%diouxXeEfFgGaAcpsn一个之间的所有内容和替换用{k}其中k从0到最大为99(在代码中不检查:超过100 %在输入返回一个不好的格式字符串)。

这并不认为*在指令特殊。

#include <string.h> 

void convertCtoCSharpFormat(char *dst, const char *src) { 
    int k1 = 0, k2 = 0; 
    while (*src) { 
    while (*src && (*src != '%')) *dst++ = *src++; 
    if (*src == '%') { 
     const char *percent; 
     src++; 
     if (*src == '%') { *dst++ = '%'; continue; } 
     if (*src == 0) { /* error: unmatched % */; *dst = 0; return; } 
     percent = src; 
     /* ignore everything between the % and the conversion specifier */ 
     while (!strchr("diouxXeEfFgGaAcpsn", *src)) src++; 

     /* replace with {k} */ 
     *dst++ = '{'; 
     if (k2) *dst++ = k2 + '0'; 
     *dst++ = k1++ + '0'; 
     if (k1 == 10) { k2++; k1 = 0; } 
     /* *src has the conversion specifier if needed */ 
     /* percent points to the initial character of the conversion directive */ 
     if (*src == 'f') { 
     *dst++ = ','; 
     while (*percent != 'f') *dst++ = *percent++; 
     } 
     *dst++ = '}'; 
     src++; 
    } 
    } 
    *dst = 0; 
} 

#ifdef TEST 
#include <stdio.h> 
int main(void) { 
    char test[] = "Bloke %s drank %5.2f litres of booze and ate %d bananas"; 
    char out[1000]; 

    convertCtoCSharpFormat(out, test); 
    printf("C fprintf string: %s\nC# format string: %s\n", test, out); 
    return 0; 
} 
#endif 
+0

感谢您的努力。正如它在标题中所说的,我正在寻找C#2.0解决方案。我自然明白C,所以我检查将它转换为C#是否合理。不管怎么说,还是要谢谢你。 – 2010-11-04 15:26:16

+0

啊,大声笑 - 我没有读到标题:) – pmg 2010-11-04 15:32:31