for WPF developers
Home Profile Tips 全記事一覧

StringFormat によってフォーマットを指定する

(2017/04/26 14:21:01 created.)

(2017/05/24 16:58:41 modified.)

TextBlock コントロールなどでテキストを表示するときに、ViewModel から与えられたものを変換して表示したい場合には StringFormat が便利です。

MainViewModel.cs
  1. namespace Tips_StringFormat.ViewModels
  2. {
  3.     using System;
  4.  
  5.     public class MainViewModel
  6.     {
  7.         /// <summary>
  8.         /// 新しいインスタンスを生成します。
  9.         /// </summary>
  10.         public MainViewModel()
  11.         {
  12.             this.Value = 1234.56789;
  13.             this.Integer = 123456789;
  14.             this.Text = "123456789";
  15.             this.Name = "田中 太郎";
  16.             this.Date = DateTime.Now;
  17.         }
  18.  
  19.         /// <summary>
  20.         /// 小数を持つ数値を取得します。
  21.         /// </summary>
  22.         public double Value { get; private set; }
  23.  
  24.         /// <summary>
  25.         /// 整数値を取得します。
  26.         /// </summary>
  27.         public int Integer { get; private set; }
  28.  
  29.         /// <summary>
  30.         /// 数値の文字列表現を取得します。
  31.         /// </summary>
  32.         public string Text { get; private set; }
  33.  
  34.         /// <summary>
  35.         /// 文字列を取得します。
  36.         /// </summary>
  37.         public string Name { get; private set; }
  38.  
  39.         /// <summary>
  40.         /// 日付を取得します。
  41.         /// </summary>
  42.         public DateTime Date { get; private set; }
  43.     }
  44. }
MainView.xaml
  1. <Window x:Class="Tips_StringFormat.Views.MainView"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         Title="MainView" Height="420" Width="525">
  5.     <StackPanel>
  6.         <GroupBox Header="数値の表示">
  7.             <StackPanel>
  8.                 <TextBlock Text="{Binding Value, StringFormat={}{0:N2}}"/>
  9.                 <TextBlock Text="{Binding Value, StringFormat={}{0:N3}}"/>
  10.                 <TextBlock Text="{Binding Value, StringFormat={}{0:00000}}"/>
  11.             </StackPanel>
  12.         </GroupBox>
  13.  
  14.         <GroupBox Header="価格の表示">
  15.             <StackPanel>
  16.                 <TextBlock Text="{Binding Integer, StringFormat={}{0:C}}"/>
  17.                 <TextBlock Text="{Binding Integer, StringFormat={}{0:C}, ConverterCulture=ja-JP}"/>
  18.                 <TextBlock Text="{Binding Integer, StringFormat=定価{0:N0}}"/>
  19.                 <TextBlock Text="文字列による数値表現に StringFormat は効果がない" />
  20.                 <TextBlock Text="{Binding Text, StringFormat={}{0:N2}}"/>
  21.             </StackPanel>
  22.         </GroupBox>
  23.  
  24.         <GroupBox Header="16 進数の表示">
  25.             <StackPanel>
  26.                 <TextBlock Text="{Binding Integer, StringFormat={}{0:X}}"/>
  27.                 <TextBlock Text="{Binding Integer, StringFormat={}0x{0:X8}}"/>
  28.             </StackPanel>
  29.         </GroupBox>
  30.  
  31.         <GroupBox Header="日付の表示">
  32.             <StackPanel>
  33.                 <TextBlock Text="{Binding Date}"/>
  34.                 <TextBlock Text="{Binding Date, ConverterCulture=ja-JP}"/>
  35.                 <TextBlock Text="{Binding Date, StringFormat={}{0:yyyy年MM月dd日 HH:mm:ss}}"/>
  36.             </StackPanel>
  37.         </GroupBox>
  38.  
  39.         <GroupBox Header="マルチバインディング">
  40.             <TextBlock>
  41.                 <TextBlock.Text>
  42.                     <MultiBinding StringFormat="氏名:{0} 得点:{1:N0}点">
  43.                         <Binding Path="Name"/>
  44.                         <Binding Path="Integer"/>
  45.                     </MultiBinding>
  46.                 </TextBlock.Text>
  47.             </TextBlock>
  48.         </GroupBox>
  49.     </StackPanel>
  50. </Window>


上記の例のように、StringFormat には数値書式指定文字列を指定します。数値書式指定文字列には次のようなものがあります。

書式指定子 サポートするデータ型 説明
"C" または "c" すべての数値型 通貨として表示します。
"D" または "d" 整数型のみ 必要に応じて負の符号を付けて表示します。
"E" または "e" すべての数値型 指数表記で表示します。
"F" または "f" すべての数値型 必要に応じて負の符号を付けて整数または小数として表示します。
"G" または "g" すべての数値型 固定小数点表記または指数表記のいずれかの最も簡潔な形式で表示します。
"N" または "n" すべての数値型 必要に応じて負の符号を付け、桁区切り記号を付けて表示します。
"P" または "p" すべての数値型 数値に 100 を掛けて、パーセント記号を付けて表示します。
"R" または "r" Single, Double, BigInteger 同じ数値にラウンドトリップした文字列を表示します。
"X" または "x" 整数型のみ 16 進数文字列に変換して表示します。"0x" のプレフィックスは付きません。
その他 --- 実行時に FormatException 例外がスローされます。