2015-09-04 42 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個對象,否則會遇到更多異常。