サーチ…


前書き

Formatメソッドは、オブジェクトを特定の文字列表現に結合する文字列を作成するために使用されるSystem.Stringクラスのオーバーロードのセットです。この情報は、.NET FrameworkのString.Format 、さまざまなWriteLineメソッド、およびその他のメソッドに適用できます。

構文

  • string.Format(文字列形式、paramsオブジェクト[] args)
  • string.Format(IFormatProviderプロバイダ、文字列形式、paramsオブジェクト[] args)
  • $ "string {text} blablabla" // C#6以降

パラメーター

パラメータ詳細
フォーマット 複合書式文字列 。argsを文字列に結合する方法を定義します。
args 文字列に結合される一連のオブジェクト。これはparams引数を使用するので、引数のカンマ区切りリストまたは実際のオブジェクト配列のどちらかを使用できます。
プロバイダオブジェクトを文字列にフォーマットする方法の集まり。一般的な値には、 CultureInfo.InvariantCultureおよびCultureInfo.CurrentCultureが含まれます。

備考

ノート:

  • String.Format()は、例外をスローせずにnull引数を処理しnull
  • argsパラメータを1つ、2つ、または3つのオブジェクトパラメータで置き換えるオーバーロードがあります。

String.Formatがフレームワークに埋め込まれている場所

間接的に String.Formatを使用できる場所はいくつかあります。秘密は、署名string format, params object[] argsでオーバーロードを探すことです。

Console.WriteLine(String.Format("{0} - {1}", name, value));

より短いバージョンに置き換えることができます:

Console.WriteLine("{0} - {1}", name, value);

String.Formatなどの他のメソッドも使用できます。

Debug.WriteLine(); // and Print()
StringBuilder.AppendFormat();

カスタム数値書式を使用する

NumberFormatInfoは、整数と浮動小数点数の両方の書式設定に使用できます。

// invariantResult is "1,234,567.89"
var invarianResult = string.Format(CultureInfo.InvariantCulture, "{0:#,###,##}", 1234567.89);

// NumberFormatInfo is one of classes that implement IFormatProvider
var customProvider = new NumberFormatInfo
{
    NumberDecimalSeparator = "_NS_", // will be used instead of ','
    NumberGroupSeparator = "_GS_", // will be used instead of '.'
};

// customResult is "1_GS_234_GS_567_NS_89"
var customResult = string.Format(customProvider, "{0:#,###.##}", 1234567.89);

カスタムフォーマットプロバイダを作成する

public class CustomFormat : IFormatProvider, ICustomFormatter
{
    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (!this.Equals(formatProvider))
        {
            return null;
        }

        if (format == "Reverse")
        {
            return String.Join("", arg.ToString().Reverse());
        }

        return arg.ToString();
    }

    public object GetFormat(Type formatType)
    {
        return formatType==typeof(ICustomFormatter) ? this:null;
    }
}

使用法:

String.Format(new CustomFormat(), "-> {0:Reverse} <-", "Hello World");

出力:

-> dlroW olleH <-

左/右、パッドをスペースで整列する

中括弧の2番目の値は、置換文字列の長さを指定します。第2の値を正または負に調整することによって、ストリングのアラインメントを変更することができる。

string.Format("LEFT:  string: ->{0,-5}<- int: ->{1,-5}<-", "abc", 123);
string.Format("RIGHT: string: ->{0,5}<- int: ->{1,5}<-", "abc", 123);

出力:

LEFT:  string: ->abc  <- int: ->123  <-
RIGHT: string: ->  abc<- int: ->  123<-

数値形式

// Integral types as hex
string.Format("Hexadecimal: byte2: {0:x2}; byte4: {0:X4}; char: {1:x2}", 123, (int)'A');

// Integers with thousand separators
string.Format("Integer, thousand sep.: {0:#,#}; fixed length: >{0,10:#,#}<", 1234567);

// Integer with leading zeroes
string.Format("Integer, leading zeroes: {0:00}; ", 1);

// Decimals
string.Format("Decimal, fixed precision: {0:0.000}; as percents: {0:0.00%}", 0.12);

出力:

Hexadecimal: byte2: 7b; byte4: 007B; char: 41
Integer, thousand sep.: 1,234,567; fixed length: > 1,234,567<
Integer, leading zeroes: 01; 
Decimal, fixed precision: 0.120; as percents: 12.00%

通貨書式設定

"c"(または通貨)書式指定子は、数値を通貨量を表す文字列に変換します。

string.Format("{0:c}", 112.236677) // $112.23 - defaults to system

精度

デフォルトは2です。c1、c2、c3などを使用して精度を制御します。

string.Format("{0:C1}", 112.236677) //$112.2
string.Format("{0:C3}", 112.236677) //$112.237
string.Format("{0:C4}", 112.236677) //$112.2367
string.Format("{0:C9}", 112.236677) //$112.236677000

通貨記号

  1. カスタムCultureInfoシンボルを使用するには、 CultureInfoインスタンスを渡します。
string.Format(new CultureInfo("en-US"), "{0:c}", 112.236677); //$112.24
string.Format(new CultureInfo("de-DE"), "{0:c}", 112.236677); //112,24 €
string.Format(new CultureInfo("hi-IN"), "{0:c}", 112.236677); //₹ 112.24
  1. 任意の文字列を通貨記号として使用します。 NumberFormatInfoを使用NumberFormatInfoて、通貨記号をカスタマイズしNumberFormatInfo
NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;
nfi = (NumberFormatInfo) nfi.Clone();
nfi.CurrencySymbol = "?";
string.Format(nfi, "{0:C}", 112.236677); //?112.24
nfi.CurrencySymbol = "?%^&";
string.Format(nfi, "{0:C}", 112.236677); //?%^&112.24

通貨記号の位置

使用CurrencyPositivePatternを正の値とするためにCurrencyNegativePattern負の値のため。

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;        
nfi.CurrencyPositivePattern = 0;
string.Format(nfi, "{0:C}", 112.236677); //$112.24 - default
nfi.CurrencyPositivePattern = 1;
string.Format(nfi, "{0:C}", 112.236677); //112.24$
nfi.CurrencyPositivePattern = 2;
string.Format(nfi, "{0:C}", 112.236677); //$ 112.24
nfi.CurrencyPositivePattern = 3; 
string.Format(nfi, "{0:C}", 112.236677); //112.24 $

ネガティブパターンの使用法はポジティブパターンと同じです。より多くのユースケースは元のリンクを参照してください。

カスタム小数点区切り文字

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;        
nfi.CurrencyPositivePattern = 0;
nfi.CurrencyDecimalSeparator = "..";
string.Format(nfi, "{0:C}", 112.236677); //$112..24

C#6.0以降

6.0

C#6.0以降、 String.Format代わりに文字列補間を使用することができます。

string name = "John";
string lastname = "Doe";
Console.WriteLine($"Hello {name} {lastname}!");

こんにちはJohn Doe!

これに関する詳細は、C#6.0のトピック「 文字列補間」を参照してください

String.Format()式の中に中括弧をエスケープする

string outsidetext = "I am outside of bracket";
string.Format("{{I am in brackets!}} {0}", outsidetext);

//Outputs "{I am in brackets!} I am outside of bracket"

日付の書式設定

DateTime date = new DateTime(2016, 07, 06, 18, 30, 14);
// Format: year, month, day hours, minutes, seconds

Console.Write(String.Format("{0:dd}",date)); 

//Format by Culture info
String.Format(new System.Globalization.CultureInfo("mn-MN"),"{0:dddd}",date);
6.0
Console.Write($"{date:ddd}");

出力:

06
Лхагва
06
指定子意味サンプル結果
d 日付 {0:d} 2014年7月6日
DD ゼロデパッド {0:dd} 06
ddd 短日の名前 {0:ddd} 結婚した
dddd 終日の名前 {0:dddd} 水曜日
D 長い日付 {0:D} 2016年7月6日水曜日
f 完全な日付と時刻、短い {0:f} 2016年7月6日(水)午後6時30分
ff 2番目の小数点、2桁 {0:ff} 20
fff 2番目の小数点、3桁 {0:fff} 201
ffff 2番目の小数点、4桁 {0:ffff} 2016年
F 完全な日時 {0:F} 2016年7月6日水曜日6:30:14 PM
g デフォルトの日付と時刻 {0:g} 2014年7月6日6:30 PM
gg 時代 {0:gg} 広告
hh 時間(2桁、12H) {0:hh} 06
HH 時間(2桁、24時間) {0:HH} 18
M 月と日 {0:M} 7月6日
mm 分、ゼロパッド {0:mm} 30
MM 月、ゼロパッド {0:MM} 07
うーん 3文字の月名 {0:MMM} 7月
んー満月の名前 {0:MMMM} 7月
SS {0:ss} 14
r RFC1123の日付 {0:r} 水曜日、2016年7月6日18:30:14 GMT
s ソート可能な日付文字列 {0:s} 2016-07-06T18:30:14
t 短時間 {0:t} 6:30 PM
T 長い時間 {0:T} 6:30:14 PM
tt 午前午後 {0:tt} PM
あなたユニバーサルソート可能な現地時間 {0:u} 2016-07-06 18:30:14Z
U ユニバーサルGMT {0:U} 2016年7月6日水曜日9:30:14 AM
Y 月と年 {0:Y} 2016年7月
yy 2桁の年 {0:yy} 16
yyyy 4桁の年 {0:yyyy} 2016年
グーグー 2桁のタイムゾーンオフセット {0:zz} +09
zzz フルタイムゾーンオフセット {0:zzz} +09:00

ToString()

ToString()メソッドは、すべての参照オブジェクト型に存在します。これはToString()メソッドを持つObjectから派生したすべての参照型によるものです。オブジェクト基本クラスのToString()メソッドは型名を返します。以下の部分はコンソールに "User"を表示します。

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
}

...

var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());

ただし、クラスUserは、返される文字列を変更するためにToString()をオーバーライドすることもできます。以下のコードは、 "Id:5、Name:User1"をコンソールに出力します。

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
    public override ToString()
    {
        return string.Format("Id: {0}, Name: {1}", Id, Name);
    }
}

...

var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());

ToString()との関係

String.Format()メソッドはデータを文字列として書式設定する際には有効ですが、特に以下のように単一のオブジェクトを扱う場合には、少し過剰なものになることがあります。

String.Format("{0:C}", money);  // yields "$42.00"

より簡単なアプローチは、C#内のすべてのオブジェクトで使用できるToString()メソッドを単純に使用することです。同じ標準およびカスタム書式設定文字列をすべてサポートしますが、引数が1つしかないため、必要なパラメータマッピングは必要ありません。

money.ToString("C");  // yields "$42.00"

警告と書式の制限

このアプローチは、いくつかのシナリオでは簡単かもしれませんが、 ToString()アプローチは、 String.Format()メソッドのように、左または右のパディングを追加することに関して制限されています。

String.Format("{0,10:C}", money);  // yields "    $42.00"

ToString()メソッドでこの同じ動作を実現するには、 PadLeft()またはPadRight()ような別のメソッドを使用する必要があります。

money.ToString("C").PadLeft(10);  // yields "    $42.00"


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow