.NET String.Format()は、数値のコンマを数千位で追加します


回答:


1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876

39
String.Format("{0:#,##0}", 1234);また、小数点以下なしでも機能します。
Greg Bray、

9
「N」指定子を複製するにはどうすればよいですか。ただし、数値に存在するのと同じ数の10進数字を使用できますか?
Stephen Drew

56
@Justin:msdn.microsoft.com/en-us/library/0c899ak8.aspxによると、 '、'(および '。')はローカライズされた正しい文字に置き換えられます。
Roger Lipscombe 2013年

@RogerLipscombe私はそれに気づいていませんでした
Justin

6
@VVVV-おそらく数値ではなく文字列を渡しています。文字列がある場合は、最初にfloatまたはdoubleに変換する必要があります。試してみるstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve 2017年

379

これが最も簡単な方法であることがわかりました:

myInteger.ToString("N0")

1
string.Formatのように、string.Formatで使用することもできます。ここでは、小数点を含まない、カンマを含むいくつかの数値、{0:N0} "、123456789(;
Dan Morphis

16
myInteger.ToString( "N0")とすべきではありません... string.tostringは機能しないと思います。
テイラーブラウン

1
もう5年になったと思いますが、ありがとう!4文字以上4文字以下の数字で機能します。
AskYous

@AskYous-まあ、それはまた4文字で機能します。
Broots Waymb 2017年

これは機能していますが、地域の設定によって変化しています
saulyasar

149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000

27
このソリューションは、国際化の観点からは良くありません。他の文化では,、スペースやさらには千の区切り文字以外の文字を使用してい.ます。
ジャスティン

6
おかげで動作します+1。拡張されているため、最大2 dpの数値が表示されます。ToString( "#、## 0。##")
Crab Bucket

8
@MacSigler実際には正しくありません。上記の回答に関するRoger Lipscombeのコメントを参照してください。String.Formatはローカリゼーションを自動的に適用します。
Dan Bechard 2013年

10
@MacSiglerしかし、このコード 常にコンマを出力するわけではありません。カルチャがコンマを期待するものである場合のみ(たとえば、en-USまたは不変)。カルチャが別の区切り文字を必要とするものである場合(たとえば.)、. NETは自動的にコンマをその区切り文字に置き換えます。繰り返しますが、これがなぜなのかまだ理解できない場合は、Rogerが投稿したリンクを読むことをお勧めします。
Dan Bechard 2013年

4
@MacSigler Justinのコメントは、カルチャを明示的に強制的にen-USにしないと、ローカルマシンからカルチャ設定を継承するという点で、まだ正しいです。私の理解では、上記のコードをコンパイルしてから、カルチャが異なる(数値セパレーターが異なる)2台のマシンで実行すると、異なる結果が得られます。あなたはそれをしたい場合は、必ずカンマを生産するには、明示的に(例えば不変)コンマを使用して文化を設定する必要があります。
Dan Bechard 2013年

98

文化に特化したい場合は、これを試してみてください。

(19950000.0).ToString("N",new CultureInfo("en-US")) = 19,950,000.00

(19950000.0).ToString("N",new CultureInfo("is-IS")) = 19.950.000,00

注:一部のカルチャ,では.、注意するのではなく、小数を意味するために使用しています。


77

関連する出力を備えた標準フォーマット

Console.WriteLine("Standard Numeric Format Specifiers");
String s = String.Format("(C) Currency: . . . . . . . . {0:C}\n" +
                    "(D) Decimal:. . . . . . . . . {0:D}\n" +
                    "(E) Scientific: . . . . . . . {1:E}\n" +
                    "(F) Fixed point:. . . . . . . {1:F}\n" +
                    "(G) General:. . . . . . . . . {0:G}\n" +
                    "    (default):. . . . . . . . {0} (default = 'G')\n" +
                    "(N) Number: . . . . . . . . . {0:N}\n" +
                    "(P) Percent:. . . . . . . . . {1:P}\n" +
                    "(R) Round-trip: . . . . . . . {1:R}\n" +
                    "(X) Hexadecimal:. . . . . . . {0:X}\n",
                    - 1234, -1234.565F);
Console.WriteLine(s);

出力例(en-usカルチャ):

(C) Currency: . . . . . . . . ($1,234.00)
(D) Decimal:. . . . . . . . . -1234
(E) Scientific: . . . . . . . -1.234565E+003
(F) Fixed point:. . . . . . . -1234.57
(G) General:. . . . . . . . . -1234
    (default):. . . . . . . . -1234 (default = 'G')
(N) Number: . . . . . . . . . -1,234.00
(P) Percent:. . . . . . . . . -123,456.50 %
(R) Round-trip: . . . . . . . -1234.565
(X) Hexadecimal:. . . . . . . FFFFFB2E

2
この回答には多くの有用な情報が詰め込まれていました。例で学ぶと、文字列形式で0と1の意味がわかります。
user420667 2016年

41

これが最適な形式です。これらのすべてのケースで機能します。

String.Format( "{0:#,##0.##}", 0 ); // 0
String.Format( "{0:#,##0.##}", 0.5 ); // 0.5 - some of the formats above fail here. 
String.Format( "{0:#,##0.##}", 12314 ); // 12,314
String.Format( "{0:#,##0.##}", 12314.23123 ); // 12,314.23
String.Format( "{0:#,##0.##}", 12314.2 ); // 12,314.2
String.Format( "{0:#,##0.##}", 1231412314.2 ); // 1,231,412,314.2

1
千の区切り文字としてドットを使用し、小数点の区切り文字としてカンマを使用する場合はどうなりますか?
FrenkyB 2017

12,314.0(n1形式のように)を表示しないが、12,314を表示するため、賛成票を投じられました:)
NDUF

34
String.Format("{0:#,###,###.##}", MyNumber)

これにより、関連するポイントにコンマが表示されます。


10
":n"メソッドは、ユーザーのロケールを尊重する必要があるため、より優れています。
トルラック2008

12
これは真実ですが、ユーザーのロケールを尊重するため、1000の時点でコンマを与えるとは限りません。
スティーブンライトン2008

2
すぐにわかります。これは真実ですが、カンマを3桁ごとの区切り文字として使用するため、ユーザーのロケールを尊重するとは限りません。(例として、ポルトガルでは、カンマは代わりに小数点記号になります。)
ANeves

1
の後に値を適用する場合。#を0に置き換える必要があります。msdn.microsoft.com / en-us / library / 0c899ak8(v=vs.110).aspx:0は、存在する場合、対応する数字でゼロを置き換えます。それ以外の場合、結果の文字列にはゼロが表示されますが、「#」記号は対応する数字が存在する場合はそれに置き換えられます。それ以外の場合、結果の文字列に数字は表示されません。
Clarice Bouwer、2014

このメソッドは私の要件で問題なく機能しました、それが使用される主な場所であるInt32.ToStringメソッドに関するmsdnページmsdn.microsoft.com/en-us/library/8wch342y.aspxは、この特定のものにはあまり役に立ちませんアプリケーションのいずれか
stackuser83 '25年

33

最も投票された回答は素晴らしく、約7年間役に立ちました。C#6.0、特に文字列補間の導入により、きちんとした、そしてIMOより安全な、求められていることを実行する方法がありますto add commas in thousands place for a number

var i = 5222000;
var s = $"{i:n} is the number"; // results to > 5,222,000.00 is the number
s = $"{i:n0} has no decimal"; // results to > 5,222,000 has no decimal

変数i がプレースホルダー(つまり{0})の代わりに配置される場所。したがって、どのオブジェクトがどの位置に移動するかを覚えておく必要はありません。フォーマット(つまり:n)は変更されていません。新機能の完全な機能については、このページにアクセスしてください


29

このように単純です:

float num = 23658; // for example 
num = num.ToString("N0"); // Returns 23,658

詳細はこちら


21

カルチャに関係なく(たとえば、トレースまたはログメッセージで) "、"セパレーターを強制したい場合は、次のコードが機能し、次のコードにつまずく人にあなたが何をしているのか正確に伝えるという追加の利点があります。

int integerValue = 19400320; 
string formatted = string.Format(CultureInfo.InvariantCulture, "{0:N0}", integerValue);

「19,400,320」にフォーマットされたセット


21

次の例は、ゼロのプレースホルダーを含むカスタム形式の文字列を使用してフォーマットされたいくつかの値を表示します。

String.Format("{0:N1}", 29255.0);

または

29255.0.ToString("N1")

結果「29,255.0」

String.Format("{0:N2}", 29255.0);

または

29255.0.ToString("N2")

結果 "29,255.00"


いい答えですが、29.255,00はどうですか?
Roxy'Pro

@ Roxy'Proロケール/カルチャーを変更しますか?
Maarten Bodewes

私は.. =そのような「F1」やなめらか、「N1」のような対応する文字があると思った)しかし、文化はdefinatelly働くだろうchaning @MaartenBodewes
Roxy'Pro

11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));

3
またはConsole.WriteLine( "{0:#、#}"、num); 印刷したいだけの場合。しかし、string.Format(...)の方が便利だと思います。
Indy9000 2011

11

よりシンプルで、String.Formatの代わりに文字列補間を使用

 $"{12456:n0}"; // 12,456
 $"{12456:n2}"; // 12,456.00

またはyourVariableを使用する

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 

9

たとえば、String.Format("{0:0,0}", 1);01を返しますが、私は無効です

これは私のために働く

19950000.ToString("#,#", CultureInfo.InvariantCulture));

出力19,950,000


8

書式設定する値は数値でなければならないことに注意してください。数値の文字列表現を取得するようには見えません。形式はカンマです。



5

C#7.1(おそらく以前のバージョンですか?)

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";

3

このような関数を使用して数値をフォーマットし、必要に応じて小数点以下の桁数を渡すことができます。小数点以下の桁数を指定しない場合、小数点以下2桁が使用されます。

    public static string formatNumber(decimal valueIn=0, int decimalPlaces=2)
    {
        return string.Format("{0:n" + decimalPlaces.ToString() + "}", valueIn);
    }

私は10進数を使用していますが、タイプを他のタイプに変更したり、匿名オブジェクトを使用したりできます。負の小数点以下の値のエラーチェックを追加することもできます。


-2

カルチャーや潜在的なフォーマットの問題についてもう心配する必要がなかった方法は、それを通貨としてフォーマットし、後で通貨記号を取り出したことです。

if (decimal.TryParse(tblCell, out result))

{
  formattedValue = result.ToString("C").Substring(1);
}

6
このコードはカルチャに依存していません-コードを実行しているマシンに設定されているデフォルトのカルチャを使用します。これにより、そのカルチャが通貨記号を開始ではなく数字の末尾に配置する(例:)fr-FR、または通貨を示すために複数の文字を使用する(例:)da-DK、またはカンマを使用して数千を区切らない(例:ほとんどの)ヨーロッパ本土の)。
レイブ

-2

以下はJavaでの良い解決策です!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

または、より堅牢な方法で特定の場所のロケールを取得したい場合は、次のように使用します。

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

米国ロケール出力:$ 9,999,999.00

ドイツ語ロケールの出力

Locale locale = new Locale("de", "DE");

出力:9.999.999,00€

インドのロケール出力

Locale locale = new Locale("de", "DE");

出力:Rs.9,999,999.00

エストニア語ロケールの出力

Locale locale = new Locale("et", "EE");

出力:9 999 999€

別の出力で見ることができるように、セパレーターがコンマドット、またはスペースであることを心配する必要はありません。i18n標準に従ってフォーマットされた数値を取得できます。


1
どこで変数を使用しましたlocale か?
スミス、

次のように通貨インスタンスを取得する際に使用することは問題ありませんか:NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); コードを修正しました、ありがとう!
Anirudh 2013

3
タグを確認しましたか?問題はJavaではなくC#についてです!
Salar、2015

-3

それをDataGridviewに表示する場合は、そのタイプを変更する必要があります。デフォルトはStringであり、10進数に変更するため、浮動小数点数と見なされます。

Dim dt As DataTable = New DataTable
dt.Columns.Add("col1", GetType(Decimal))
dt.Rows.Add(1)
dt.Rows.Add(10)
dt.Rows.Add(2)

DataGridView1.DataSource = dt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.