使用 ToString 格式化输出

本文关键字:输出 格式化 ToString 使用 | 更新日期: 2023-09-27 17:56:01

我正在尝试在 C# 中编辑我的"燃料消耗"行,以在数字数量后输出"加仑"一词。我不确定如何操作 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"); }

使用 ToString 格式化输出

与已经预执行的串联类似,您可以在变量之后但在任何换行符之前插入另一个由加号+运算符括起来的字符串文字,这会将度量单位放在数值之后。例如:

+ " gallons" +

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

如果您想保留包含两个换行符的原始格式,这应该以更节省内存的方式进行,同时为您提供所需的"加仑"后缀。

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();

首先,如果你真的想让 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() 的原因是将对象的表示形式从默认值更改为格式,而不是格式化用户界面的信息。如果这是动机,你最好通过第二个对象来做到这一点并避免气味,除非你制定规则,所有对象的行为方式都相同(仍然不是很好,但一致性更容易遵循)。

如果这是一次性或临时应用程序,您可能会侥幸逃脱。如果是个人的,那是你自己的事,所以做你想做的事。对于企业软件,我会在代码审查中标记它,并强迫某人让我知道他们为什么使用这种特定模式,因为它是非标准的,可能违反最佳实践。

更新:请参阅@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