演習 - 文字列の書式設定の基本を調査する

完了

このユニットでは、特に複数の変数を使用する場合に、効率的な表示のために文字列を書式設定する方法について説明します。

コーディング環境を準備する

このモジュールには、デモ コードをビルドして実行するプロセスをガイドする実践的なアクティビティが含まれています。 これらのアクティビティを完了するために、開発環境として Visual Studio Code を使用することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中のプロフェッショナルが使用する開発環境でコードの記述と実行をより快適に行うことができます。

注意

この C# シリーズの Microsoft Learn を完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている場合があります。 その場合は、手順の次のセクションをスキップし、前の演習で使用した Project.cs ファイル内のコードを削除できます。

  1. Visual Studio Code を開きます。 Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。

  2. Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。

  3. [フォルダーを開く] ダイアログで、Windows のデスクトップ フォルダーに移動します。 コード プロジェクトを保持するフォルダーの場所が別にある場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。

  4. [フォルダーを開く] ダイアログで、[フォルダーの選択] を選択します。 作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[はい] を選択します。

  5. Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。 [ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 次に例を示します。

    C:\Users\someuser\Desktop>
    
  6. ターミナルのコマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、「dotnet new console -o ./CsharpProjects/TestProject」と入力してから、Enter キーを押します。 この .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドで [CsharpProjects] と [TestProject] のフォルダーが自動的に作成され、.csproj ファイルの名前として TestProject が使用されます。

  7. [エクスプローラー] パネルで、[CsharpProjects] フォルダーを展開します。 [TestProject] フォルダーと、Program.cs という名前の C# プログラム ファイルと、TestProject.csproj という名前の C# プロジェクト ファイルの 2 つが表示されるはずです。

  8. [エクスプローラー] パネルの [エディター] パネルにコード ファイルを表示するには、[Program.cs] を選択します。

  9. 既存のコード行を削除します。 このモジュールでは、この C# コンソール プロジェクトを使用して、コード サンプルを作成およびビルドして実行します。

  10. [ターミナル] パネルを閉じます。

複合書式設定とは?

"複合書式設定" では、文字列内で番号付きプレースホルダーが使用されます。 実行時に、中かっこ内の値はすべて、その位置に基づいて渡される値に解決されます。

次に示すのは、string データ型のキーワードに対して組み込みメソッド Format() を使用した複合書式設定の例です。 Visual Studio Code エディターで次のようにコードを更新してください。

string first = "Hello";
string second = "World";
string result = string.Format("{0} {1}!", first, second);
Console.WriteLine(result);

このコードを実行すると、次の出力が表示されます。

Hello World!

このコードについては注意すべき重要事項がいくつかあります。

  • データ型と、指定されたデータ型の変数には、特定のタスクを簡単にするための "ヘルパー メソッド" が組み込まれています。
  • リテラル文字列 "{0} {1}!" ではテンプレートが形成されます。この一部分は実行時に置き換えられます。
  • トークン {0} は、文字列テンプレートの後の最初の引数、つまり、変数 first の値によって置き換えられます。
  • トークン {1} は、文字列テンプレートの後の 2 番目の引数、つまり、変数 second の値によって置き換えられます。

注意

数字 0 で始まるのは、奇妙だと思うかもしれません。 実際、これはソフトウェア開発では非常に一般的です。 数値を使用して識別できる一連の項目がある場合はいつも、番号は通常 0 から始まります。

  1. 次のようにコードを更新します。

    string first = "Hello";
    string second = "World";
    Console.WriteLine("{1} {0}!", first, second);
    Console.WriteLine("{0} {0} {0}!", first, second);
    
  2. コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。 次の出力が表示されます。

    World Hello!
    Hello Hello Hello!
    

これらの例については、次のいくつかの点に注目してください。

  • 1 つ目の Console.WriteLine() ステートメントでは、トークンを任意の順序で配置できることを確認してください。 サンプル コードは、{0} の前に {1} があります。
  • 2 番目の Console.WriteLine() ステートメントでは、{0} の 3 つのインスタンスでトークンを再利用できることを確認してください。 また、2 番目の変数引数である second は使用されません。 それでも、コードはエラーなしで実行されます。

文字列補間とは?

"文字列補間" は、複合書式設定を簡略化する手法です。

番号付きトークンを使用して、リテラル値または変数名を String.Format() または Console.WriteLine() の引数リストに含めるのではなく、中かっこ内で変数名を使用するだけで済みます。

  1. 文字列を補間するには、そのプレフィックスとして $ ディレクティブを使用する必要があります。 ここでは、複合書式設定ではなく文字列補間を使用して、前と同じ例を作成します。 次のようにコードを更新します。

    string first = "Hello";
    string second = "World";
    Console.WriteLine($"{first} {second}!");
    Console.WriteLine($"{second} {first}!");
    Console.WriteLine($"{first} {first} {first}!");
    
  2. コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。 次の出力が表示されます。

    Hello World!
    World Hello!
    Hello Hello Hello!
    

Note

書籍やインターネット上でコードの例を参照すると、"複合書式設定" と "文字列補完" の両方が使われていることがよくありますが、通常は "文字列補完" を選択してください。

通貨の書式設定

複合書式設定および文字列補間を使用すれば、特定の言語とカルチャに応じて、表示する値の書式を設定できます。 次の例では、:C 通貨書式指定子を使用して、pricediscount 変数を通貨として表示します。 次のようにコードを更新します。

decimal price = 123.45m;
int discount = 50;
Console.WriteLine($"Price: {price:C} (Save {discount:C})");

Windows の表示言語が "英語 (米国)" に設定されているコンピューター上でこのコードを実行した場合、次の出力が表示されます。

Price: $123.45 (Save $50.00)

:C を中かっこ内のトークンに追加すると、int または decimal のどちらを使用するかに関係なく、数値が通貨として書式設定されることに注意してください。

Note

国または地域と言語が不明な場合はどうなるでしょうか? 前述のコードを TrydotNet などの "ブラウザー内" .NET エディターで実行すると、次の出力が表示されます。 Price: ¤123.45 (Save ¤50.00) 記号 ¤ が、国または地域の通貨を表す記号の代わりに使用されます。 これは、通貨の "種類" に関係なく、"通貨" を示すのに使用される汎用記号です。 .NET エディターでは、現在の場所が無視されるため、この記号が表示されます。

ユーザーの国または地域と言語が文字列の書式設定に影響するしくみ

フランス国内で Windows の表示言語がフランス語に設定されているコンピューター上で前述のコードを実行するとどうなるでしょうか? その場合は、次のメッセージが表示されます。

Price: 123,45 € (Save 50,00 €)

前の "€" 出力の理由は、文字列通貨の書式設定機能が "カルチャ" のローカル コンピューター設定に依存しているためです。 このコンテキストで、"カルチャ" という用語はエンド ユーザーの国や地域と言語を指します。 "カルチャ コード" は 5 文字からなる文字列で、コンピューターがエンド ユーザーの位置と言語を識別するのに使用されます。 カルチャ コードを使用すると、日付や通貨などの特定の情報を適切に表示できます。

次に例を示します。

  • 米国で英語を話す人のカルチャコードは en-US です。
  • フランスでフランス語を話す人のカルチャコードは fr-FR です。
  • カナダでフランス語を話す人のカルチャコードは fr-CA です。

カルチャは、書記体系、使用されるカレンダー、文字列の並べ替え順序、および日付と数値の書式設定 (通貨の書式設定など) に影響します。

残念ながら、国や地域またはエンド ユーザーの言語に関係なく、すべてのコンピューターでコードが正しく動作するのを確認するのは困難です。 このプロセスは "ローカリゼーション" (または "グローバリゼーション") と呼ばれています。 ローカライズは、このモジュールで説明されていない多くの要因に依存しますが、単純に、文字列の書式設定構文では、ユーザーのカルチャに応じて異なる形式が使用される場合があります。

数値の書式設定

数値データを使用する場合は、数千、数百万、数十億などを表すコンマを含めることで、数値を読みやすく書式設定することができます。

N 数値書式指定子を使用すると、数値が読みやすくなります。 次のようにコードを更新します。

decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N} units");

これを en-US カルチャから表示すると、次の出力が表示されます。

Measurement: 123,456.79 units

既定では、N 数値書式指定子によって、小数点の後の 2 桁のみが表示されます。

表示精度をさらに高めるには、指定子の後に数値を追加します。 次のコードでは、N4 指定子を使用して、小数点の後に 4 桁の数字が表示されます。 次のようにコードを更新します。

decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N4} units");

これを en-US カルチャから表示すると、次の出力が表示されます。

Measurement: 123,456.7891 units

パーセンテージの書式設定

パーセンテージを書式設定するには、P 書式指定子を使用します。 後に数字を追加することで、小数点の後に表示される値の数が制御されます。 次のようにコードを更新します。

decimal tax = .36785m;
Console.WriteLine($"Tax rate: {tax:P2}");

これを en-US カルチャから表示すると、次の出力が表示されます。

Tax rate: 36.79 %

書式設定方法の組み合わせ

文字列変数は、書式設定手法を使用して作成された文字列を保存できます。 次の例では、10 進数と 10 進数の計算の結果を書式設定し、複合書式設定を使用して yourDiscount 文字列に格納します。

次のようにコードを更新してください。

decimal price = 67.55m;
decimal salePrice = 59.99m;

string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);

Console.WriteLine(yourDiscount);

これを en-US カルチャから表示すると、次の出力が表示されます。

You saved $7.56 off the regular $67.55 price. 

複数の書式設定された文字列を組み合わせることができます。 前のコードで、Console.WriteLine() の前の行のコードに yourDiscount += $"A discount of {(price - salePrice)/price:P2}!"; を挿入して、文字列連結ではなく文字列補間を使用して計算されたパーセンテージを連結して、ビルドしてください。

注意

この文字列補間アプローチでは String.Format() を使用する必要はありません。

次のようにコードを更新してください。

decimal price = 67.55m;
decimal salePrice = 59.99m;

string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);

yourDiscount += $"A discount of {((price - salePrice)/price):P2}!"; //inserted
Console.WriteLine(yourDiscount);

このユニットを en-US カルチャから表示すると、次の出力が表示されます。

You saved $7.56 off the regular $67.55 price. A discount of 11.19%!

要点

文字列の書式設定について、このユニットの最も重要なポイントを次に示します。

  • 複合書式設定または文字列補間を使用して、文字列を書式設定することができます。
  • 複合書式設定では、{0} の形式で 1 つまたは複数の置換トークンを含む文字列テンプレートを使用します。 また、順序に基づいて置換トークンと照合される引数のリストも指定します。 複合書式設定は、string.Format() または Console.WriteLine() を使用する場合に機能します。
  • 文字列補間では、中かっこで囲まれた置き換えたい変数名を含む文字列テンプレートを使用します。 文字列テンプレートの前に $ ディレクティブを使用して、文字列を補間することを示します。
  • :C 指定子を使用して通貨の書式を設定します。
  • :N 指定子を使用して数値の書式を設定します。 {myNumber:N3} のように :N の後に数値を使用して、精度 (小数点の後の値の数) を制御します。
  • パーセンテージを書式設定するには、:P 書式指定子を使用してください。
  • 通貨と数値の書式設定は、エンド ユーザーのカルチャによって異なります。これは、ユーザーの国または地域と言語 (使用しているコンピューターでの設定による) を含む 5 文字のコードです。

自分の知識をチェックする

1.

Console.WriteLine($"Tax rate: {tax:P1}"); の出力で、taxdecimal tax =.12051 m; で定義されているのはどれですか?