2016-07-08 73 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