2016-07-08 95 views
-3

我試圖在C#中編輯我的Fuel Consumed行,輸出數字數量後的單詞「gallons」。我不知道如何操作ToString來完成此操作。任何幫助,將不勝感激。使用ToString格式化輸出

// toString method to display object information 
    public override string ToString() 
     { return "\n\nDestination: " + destinationCity + 
       "\n\nTotal Miles: " + mileageRoundTrip.ToString("F0") + 
       "\n\nFuel Consumed: " + gallonsUsed.ToString("F1") + 
       "\n\nFuel Cost Per Gallon: " + gallonsCost.ToString("C") + 
       "\n\nTotal Fuel Cost for this Trip: " + totalFuelCost.ToString("C") + 
       "\n\nMPG: " + amountMPG.ToString("F0") + 
       "\n\nFuel Cost Per Mile: " + costPerMile.ToString("C"); } 
+3

什麼是你現在所面臨的問題是什麼? –

回答

3

類似於您已經預成形的級聯,可以插入另一個字符串由加字面包圍的可變後+運營商但之前的任何換行符,這將數值後測量單位放置。例如:

+ " gallons" + 

編輯: GreagoryABeamer在他的崗位上做出了一些很好的意見添加加入一個強大的,有系統地實施印刷單位。我的解決方案不是這樣,如果這是在所有生產或重複代碼,這是一個更好的答案。然而,這個解決方案確實提供了快速使用和不存在開銷的機會(我相信字符串文字在編譯時在c#和C++中是連接的)。代碼也可以看起來非常乾淨,對齊變量和文字。也許haskish,但有時我更喜歡簡單快捷。 :)

+0

工程,但它加劇了創建額外的字符串返回對象的不同的字符串視圖,仍然使用反模式。 –

1

首先,如果你真的想讓ToString()在這個方法中工作,你應該使用一個StringBuilder而不是concantenating。不,concats不會讓事情減慢很多,但是你在幕後創建了很多額外的字符串來獲得你想要的。

至於添加,你可以做一些像這樣:

public override string ToString() 
{ var builder = new StringBuilder(); 
    /// more lines here 
    builder.Append(gallonCost.ToString("C")); 
    builder.Append(" gallons\n\n"); 
    // etc 
    return builder.ToString(); 
} 

您還可以創建內部helper方法對每個項目進行格式化你怎麼想,然後就在構建器將它們連接起來。它更乾淨。

但是,從建築的角度來看,這種做事方式有很多的氣味。更改ToString()的原因是將對象的表示從默認值更改爲用戶界面的格式信息。如果這是動機,你最好通過第二個對象來做到這一點,並避免這種氣味,除非你制定了一個規則,所有對象的行爲都是一樣的(仍然不是很好,但一致性更容易遵循)。

如果這是一次性或臨時應用程序,您可能會忽略它。如果它是個人的,這是你自己的事業,那麼做你想做的事。對於企業軟件,我會在代碼審查中加上標記,並強迫某人告訴我爲什麼他們使用這種特定模式,因爲它是非標準的,可能違反最佳做法。

1

更新:請參閱@ mvarta的答案,它將格式與StringBuilder相結合,以獲得更可讀的解決方案。

我發現String.format()更具可讀性,因爲你寫的整個模板作爲一個字符串:

return String.format(
    "\n\nDestination: {0}\n\nTotal Miles: {1:F0}\n\nFuel Consumed: {2:F1} gallons\n\nFuel Cost Per Gallon: {3:C}\n\nTotal Fuel Cost for this Trip: {4:C}\n\nMPG: {5:F0}\n\nFuel Cost Per Mile: {6:C}", 
    destinationCity, 
    mileageRoundTrip, 
    gallonsUsed, 
    gallonsCost, 
    totalFuelCost, 
    amounts, 
    costPerMile 
); 

要添加任何你想去的地方加侖,你簡單的寫有模板。

變量在模板中用{0},{1}等表示,其中數字是變量在以下參數中的位置。

您的toString調用中的所有特定格式也使用{0:C},{1:F1}等嵌入到模板中string.Format()正在爲你打電話toString(),所以它不那麼冗長。

https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx

2

如果您想保留原來的格式包括兩名換行符,這應該做一個內存更有效的方式,同時給你想要的「加侖」的後綴。

var sb = new StringBuilder(); 
sb.AppendFormat("\n\nDestination: {0}", destinationCity); 
sb.AppendFormat("\n\nTotal Miles: {0:F0}", mileageRoundTrip); 
sb.AppendFormat("\n\nFuel Consumed: {0:F1} gallons", gallonsUsed); 
sb.AppendFormat("\n\nFuel Cost Per Gallon: {0:C}", gallonsCost); 
sb.AppendFormat("\n\nTotal Fuel Cost for this Trip: {0:C}", totalFuelCost); 
sb.AppendFormat("\n\nMPG: {0}", amountMPG); 
sb.AppendFormat("\n\nFuel Cost Per Mile: {0:C}", costPerMile); 
return sb.ToString(); 
+0

這是最好的解決方案。由於代碼行與輸出行相匹配,所以非常易讀,格式化代碼最小化。謝謝@Mvarta延長我的知識! :) – AjahnCharles

+0

@CodeConfident謝謝。 – Mvarta