C# Language
String.Format
サーチ…
前書き
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
通貨記号
- カスタム
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
- 任意の文字列を通貨記号として使用します。
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以降
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);
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"