所以我想像这样转换字符串:
"Bloke %s drank %5.2f litres of booze and ate %d bananas"
使用.Format或.AppendFormat方法的C#等价物
"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 :(得分: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);
可以想象你可以添加这样的东西作为String的扩展方法,但我认为你最大的问题是特殊格式的说明符。如果在这方面它是非平凡的,您可能需要设计一个正则表达式来捕获它们并有意义地执行替换。
答案 1 :(得分: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
。
{{1}}
答案 2 :(得分:0)
很抱歉发布尸检,但这是我的部分解决方案:
Regex pattern = new Regex(@"%[+\-0-9]*\.*([0-9]*)([xXeEfFdDgG])");
//prepare for regex
string csharpformat = originaltext.Replace("%%", "%").Replace("{", "{{").Replace("}", "}}").Replace("%s", "{0}");
newFormat = pattern.Replace(csharpformat, m =>
{
if (m.Groups.Count == 3)
{
return "{0:" + m.Groups[2].Value + m.Groups[1].Value + "}";
}
return "{0}";
});
它捕获 %.2f 并转换为 {0:f2}