2015-09-04 161 views
0

我有以下变量:多行字符串文本格式给我的错误 - 输入字符串的不正确的格式

var setting = 
[email protected]"worker_processes  {{0}}; 
worker_rlimit_nofile {{1}}; 
error_log    logs/{{2}} {{3}}; 

events 
{{ 
    worker_connections {{4}}; 
    multi_accept {{5}}; 
}}"; 

当我做了以下String.Format()操作:

return string.Format(setting, 
    this.worker_processes, 
    this.worker_rlimit_nofile, 
    this.error_log_file, 
    this.error_log_level, 
    this.worker_connections 
    this.multi_accept ? "on" : "off"); 

我收到以下错误:输入字符串格式不正确。

有什么建议吗?


编辑 - 固定

感谢乔恩斯基特,我已经在这个解决方案抵达,而无需使用String.Format()

return 
[email protected]"worker_processes   { this.worker_processes }; 
    worker_rlimit_nofile { this.worker_rlimit_nofile }; 
    error_log    logs/{ this.error_log_file } { this.error_log_level }; 

    events 
    {{ 
     worker_connections { this.worker_connections }; 
     multi_accept { (this.multi_accept ? "on" : "off") }; 
    }}"; 
+4

如果你使用的是C#5.0(根据你的标签)'$ @'根本不应该工作 - 并且不清楚你为什么试图使用它。你究竟在努力实现什么? –

+0

注意:有6个占位符和4个参数...(这应该给出不同的错误 - 所以假设是复制粘贴错误)。 –

+0

@JonSkeet对不起,我打算说我正在使用C#4.5。我有一个为nginx配置文件保存“模板”的变量。然后我想用设置中的值替换占位符。 – Latheesan

回答

4

目前还不清楚究竟发生了什么事,因为是版本混乱,但我嫌犯你只想:

var setting = 
@"worker_processes  {0}; 
worker_rlimit_nofile {1}; 
error_log    logs/{2} {3}; 

events 
{{ 
    worker_connections {4}; 
    multi_accept {5}; 
}}"; 

现在,events块的括号仍然会被转义,但其余的将被视为格式说明符。

这里的一个完整的例子:

using System; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     var setting = 
@"worker_processes  {0}; 
worker_rlimit_nofile {1}; 
error_log    logs/{2} {3}; 

events 
{{ 
    worker_connections {4}; 
    multi_accept {5}; 
}}"; 
     string text = string.Format(setting, 10, true, "log.txt", "debug", 20, false); 
     Console.WriteLine(text); 
    } 
} 

输出:

worker_processes  10; 
worker_rlimit_nofile True; 
error_log    logs/log.txt debug; 

events 
{ 
    worker_connections 20; 
    multi_accept False; 
} 

或者用字符串内插从C#6:

return [email protected]"worker_processes  {worker_processes}; 
worker_rlimit_nofile {worker_rlimit_nofile}; 
error_log    logs/{error_log_file} {error_log_level}; 

events 
{{ 
    worker_connections {worker_connections}; 
    multi_accept {multi_accept}; 
}}"; 
+0

谢谢,这正是我在追求什么。 – Latheesan

+0

使用从C#6的字符串插值,我该如何处理条件值(例如在我的例子中:'this.multi_accept?'on“:”off“'?这是否工作:'返回$ @”multi_accept {multi_accept? on“:”off“};”;'?或者是否有不同的语法? – Latheesan

+1

@Latheesan:如果你有常量的“on”和“off”,你可以使用'{multi_accept?On:Off}'但我还没有找到包含双引号的方法,另外,开始使用.NET命名约定 - multiAccept等等是个好主意。 –

2

使用$激活串内插,其允许串根据局部变量进行自动配置。如果您要使用数字indecies和string.Format,请不要使用插值。由于内插,“events are escaping to single braces, which then are seen by格式”中的双括号作为格式说明符,但语法无效。如果您必须使用插值,再次逃脱这些括号(使他们四人间)

还要注意的是,多布尔括号逃脱出来的格式说明的,所以你需要刮所有,但括号下的“事件”或者他们会在结果字符串中返回为{0}{1}等。

最后,请注意,您只有4个对象被传递到Format--因为您的说明符数量增加到5个,您需要6个对象,否则会遇到更多异常。