有没有办法在C#/ .NET 2.0中转换C#格式字符串的C格式字符串?

时间:2010-11-04 14:06:51

标签: c# c string-formatting

所以我想像这样转换字符串:

"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"?

中回答

3 个答案:

答案 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}