2016-07-08 9 views
-3

数値量の後ろに "gallons"という単語を出力するために、C#のFuel Consumed行を編集しようとしています。私はこれを達成するために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++のコンパイル時に連結されると信じています)。コードは、変数とリテラルを整列させて非常にきれいに見えることもあります。おそらくハッキリしますが、時には私は簡単なシンプルさを好むことがあります。 :)

+0

動作しますが、オブジェクトの別の文字列ビューを返すために追加の文字列の作成を悪化させ、それでもアンチパターンを使用します。 –

1

まず、このメソッドでToString()を機能させたい場合は、ConcantenatingではなくStringBuilderを使用する必要があります。いいえ、コンカチットではそれほど遅くなることはありませんが、必要なものを得るためにバックグラウンドでたくさんの余分な文字列を作成しています。

追加するためとして、あなたはそのような何かを行うことができます。

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()を変更する理由は、オブジェクトの表現をデフォルトから変更するためであり、ユーザーインターフェイスの情報を書式設定するのではありません。それがモチベーションであれば、すべてのオブジェクトが同じように動作するというルールを作っていない限り(それでも素晴らしいものではありませんが、一貫性が追いやすくなります)、2番目のオブジェクトでこれを実行し、においを避ける方がよいでしょう。

これは一回限りのアプリまたは一時的なアプリであれば、離れてしまう可能性があります。それが個人的であれば、それはあなた自身のビジネスなので、あなたが望むことをやりなさい。エンタープライズソフトウェアでは、これをコードレビューでタグ付けし、非標準であり、ベストプラクティスの可能性が低いため、この特定のパターンを使用した理由を他の人に知らせてもらいました。

1

更新:@ mvartaの回答を参照してください。これは、より読みやすいソリューションのためにフォーマットをStringBuilderと組み合わせたものです。

あなたが1つの文字列として全体のテンプレートを作成するので、私は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

次の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

関連する問題