使用ToString格式化输出

时间:2016-07-08 00:59:43

标签: c# format output tostring

我正在尝试在C#中编辑我的Fuel Consumed行,在数字量之后输出单词“gallons”。我不知道如何操纵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"); }

4 个答案:

答案 0 :(得分:3)

与您已经预先形成的串联类似,您可以在变量之后但在任何换行符之前插入由加号+运算符包围的另一个字符串文字,这将在数值之后放置测量单位。例如:

+ " gallons" +

修改 GreagoryABeamer在他的帖子中提出了一些好处,增加了一个强大的,系统的印刷单元实现。我的解决方案不是那个,如果这是在所有生产或重复代码,这是一个更好的答案。但是,这个解决方案确实提供了快速使用和不存在开销的机会(我相信字符串文字在编译时在c#和c ++中连接)。通过对变量和文字进行一些对齐,代码看起来也很干净。也许是哈希,但有时我更喜欢简单快捷。 :)

答案 1 :(得分: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();

答案 2 :(得分: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();
}

您还可以为每个项目创建内部帮助器方法,以便根据需要对其进行格式化,然后在构建器中将它们连接起来。它更清洁。

但是,从建筑的角度来看,这种做事方式有很多气味。更改ToString()的原因是更改对象的默认表示,而不是格式化用户界面的信息。如果这是动机,你最好通过第二个对象来避免气味,除非你制定规则所有对象的行为方式相同(仍然不是很好,但更容易遵循一致性)。

如果这是一次性或临时应用,您可能会侥幸成功。如果它是个人的,这是你自己的事,所以做你想要的。对于企业软件,我会在代码审查中对此进行标记,并强迫某人告诉我他们使用此特定模式的原因,因为它是非标准的,可能违反最佳做法。

答案 3 :(得分: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