C#/.NETで文字列を書式設定する主な仕組みは2つあります。String.Format()を使う方法と、文字列補間です。
String.Format()は、固定テキストとプレースホルダー(ドキュメントでは書式項目と呼ばれます)からなる文字列(ドキュメントでは_複合書式_と呼ばれます)と、可変個の引数を受け取ります。戻り値は、各書式項目を対応する引数で解決し、解決された値を固定テキストと組み合わせます。
string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25));
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
この仕組みは、技術的には_複合書式設定_として知られています。
補間文字列は$で始まり、波括弧で囲まれた実行時の式を含みます。書式項目の構文は次のとおりです:$"{<interpolationExpression>}"。これにより、引数を別のリストとして用意する必要がなくなります。結果は、String.Format()の仕組みと機能的に同等です。
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
波括弧で囲まれたテキストは、複合書式の場合はプレースホルダー、文字列補間の場合は補間式であり、これらは_書式項目_として知られています。
書式項目は最大3つの部分から構成できます。1つ目は、上のサンプルコードにもある必須の式または引数プレースホルダーです。さらに、省略可能な配置(コンマ「,」で導入)と、省略可能な_書式文字列_(コロン「:」で導入)があります。
{<interpolationExpression>[,<alignment>][:<formatString>]}
_配置_は、テキストが配置される「フィールド」の長さを指定します。配置が正の場合は左に、負の場合は右にスペースで埋められます。
_書式文字列_は、出力テキストの形を指定します。たとえば、数値に桁区切り記号を含めるかどうか、DateTimeオブジェクトの日付部分だけを出力するかどうかなどです。
次のコードは、DateTimeオブジェクトの日付部分と、浮動小数点数を指数表記で表示する例です。
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
string.Format(
"I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
数値と日付のどちらにも、標準書式とカスタム書式があります。_カスタム_と_標準_の間に重要な違いはありませんが、カスタム書式文字列を書式文字から組み立てられるという点だけが異なります。
各スレッドには既定のカルチャThread.CurrentThread.CurrentCultureがあり、これはCultureInfoのインスタンスにカプセル化されています。スレッドのカルチャは、英国の_DD/MM/YYYY_と米国の_MM/DD/YYYY_のように従来の日付書式が異なる場合など、地域ごとの違いに応じて日付や数値がどのように書式設定されるかを決定します。
CultureInfoはIFormatProviderインターフェースを実装しており、これはString.Format()の特定のオーバーロードに渡すことができます。これを使って、スレッドのカルチャを上書きできます。
逐語的文字列を使うと、複数行の文字列を扱えます。逐語的文字列は@で始めます。
string str = @"
See no wretched
quotes everywhere
";
この演習では、高校時代から付き合っている恋人同士がSNSで愛を告白するのを手伝います。
2つの名前を受け取り、ハートで区切って表示する静的メソッドHighSchoolSweethearts.DisplaySingleLine()を実装してください。
整形されたテキストは幅61文字で、文字列の中央にハートが来るようにします。
名前はすべて、この行の幅に余裕をもって収まることが保証されています。
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
2組のイニシャルをプラス記号で区切って表示する静的メソッドHighSchoolSweethearts.DisplayBanner()を実装してください。
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
付き合い始めた日と、付き合ってきた時間の長さを、ドイツからの交換留学生向けに表示する静的メソッドHighSchoolSweethearts.DisplayGermanExchangeStudents()を実装してください。
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"