.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"지정자를 복제 할 수 있지만 숫자에있는 소수 자릿수는 어떻게합니까?
Stephen Drew

56
@Justin : msdn.microsoft.com/en-us/library/0c899ak8.aspx 에 따르면 ','(및 '.')는 현지화 된 올바른 문자로 바뀝니다.
Roger Lipscombe

@RogerLipscombe 나는 그것을 깨닫지 못했다
Justin

6
@VVVV-아마도 숫자 대신 문자열을 전달할 것입니다 . 문자열이 있으면 먼저 float 또는 double로 변환해야합니다. 시도string.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

378

나는 이것이 가장 간단한 방법이라는 것을 알았습니다.

myInteger.ToString("N0")

1
string.Format에서와 같이 string.Format과 함께 사용할 수도 있습니다. 여기에는 쉼표가 있고 소수가없는 숫자가 있습니다 ({0 : N0} "), 123456789 (;
Dan Morphis

16
myInteger.ToString ( "N0") ...해서는 안됩니다. string.tostring 작동하지 않을 것이라고 생각합니다.
Taylor Brown

1
5 년이 지났지 만 감사합니다! 숫자> 4 자 및 <4 자에서 작동합니다.
AskYous

@AskYous-글쎄, 그것은 또한 4 문자에 대해 작동합니다 .. 그것은 또한 모든 길이에 대해 작동한다고 말할 수 있습니다.
Broots Waymb

이것은 작동하지만 지역 설정에서 변경됩니다
saulyasar

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

27
이 솔루션은 국제화 관점에서 좋지 않습니다. 다른 문화권에서는 ,공백 또는 짝수와 같이 천 단위 구분 기호 이외의 문자를 사용합니다 ..
Justin

6
작품 덕분 + 1. 유무는 2 DP의 number.ToString에 쇼 있도록 최대 확장 ( "#, ## 0. ##")
게 버킷에게

8
@MacSigler 실제로 사실이 아닙니다. 위의 답변에 대한 Roger Lipscombe의 의견을 참조하십시오 : String.Format은 현지화를 자동으로 적용합니다.
Dan Bechard

10
@MacSigler 그러나이 코드 항상 쉼표를 인쇄 하지는 않습니다 . 문화가 쉼표 (예 : en-US 또는 불변)를 기대하는 문화 일 때만 해당됩니다. 문화권이 다른 구분 기호 (예 :)가 필요한 문화권이면 ..NET은 자동으로 쉼표를 해당 구분 기호로 바꿉니다. 다시 말하지만, 이것이 왜 그런지 이해하지 못한다면 Roger가 게시 한 링크를 읽으십시오.
Dan Bechard

4
@MacSigler Justin의 의견은 문화권을 명시 적으로 강제로 강제하지 않으면 로컬 컴퓨터의 문화권 설정을 상속한다는 점에서 여전히 옳습니다. 내 이해는 위의 코드를 컴파일 한 다음 다른 문화권 (번호 구분 기호가 다른)으로 두 대의 컴퓨터에서 실행하면 다른 결과가 나올 것입니다. 당신이 할 경우 항상 쉼표를 생산, 당신은 명시 적으로 (예를 들어, 불변) 쉼표를 사용하는 문화를 설정해야합니다.
Dan Bechard

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 culture) :

(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

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

이 12,314.0합니다 (N1 형식 등)을 표시하지만, 12,314 :하지 않기 때문에 upvoted
NDUF

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

관련 지점에서 쉼표를 제공합니다.


10
": n"메소드는 사용자의 로케일을 존중해야하므로 더 좋습니다.
Torlack

12
이것은 사실이지만 사용자의 로캘을 존중하기 때문에 천 점에서 쉼표를 제공한다고 보장하지는 않습니다.
Stephen Wrighton

2
바로 당신에게 : 그것은 사실이지만, 천 단위 구분 기호로 쉼표를 사용하기 때문에 사용자의 로캘을 존중한다고 보장하지는 않습니다. (예를 들어, 포르투갈에서는 쉼표가 소수점 구분 기호입니다.)
ANeves

1
. 뒤에 값을 적용하려면 #을 0으로 바꾸어야합니다 . msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : 0이 있으면 해당 숫자로 0을 대체합니다. 그렇지 않으면 결과 문자열에 0이 표시되고 "#"기호는 해당 숫자가 있으면 해당 숫자로 바뀝니다. 그렇지 않으면 결과 문자열에 숫자가 나타나지 않습니다.
Clarice Bouwer

이 방법은 내 요구 사항에 잘 작동했습니다 .Int32.ToString 메서드에 대한 msdn 페이지는 기본 위치로 사용됩니다. msdn.microsoft.com/en-us/library/8wch342y.aspx 는이 특정 항목에는별로 도움이되지 않습니다. 응용 프로그램 중 하나
stackuser83

33

가장 많이 투표 된 답변은 훌륭했으며 약 7 년 동안 도움이되었습니다. C # 6.0과 특히 String Interpolation의 도입으로 요청 된 것을 수행하는 더 깔끔하고 안전한 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은 변경되지 않았습니다. 새로운 기능의 전체 기능을 보려면이 페이지로 이동하십시오 .



21

문화권에 관계없이 (예 : 추적 또는 로그 메시지와 같이) ","구분 기호를 강제로 적용하려는 경우 다음 코드가 작동하며 다음 사람에게 정확히 무엇을하고 있는지 알려주는 이점이 있습니다.

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

"19,400,320"으로 포맷 된 세트


21

다음 예제는 자리 표시자가없는 0을 포함하는 사용자 지정 형식 문자열을 사용하여 형식이 지정된 여러 값을 표시합니다.

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

@MaartenBodewes 나는 "N1", "F1"또는 그와 같은 해당 문자가 있다고 생각했습니다 =) 그러나
찬양하는

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

3
또는 Console.WriteLine ( "{0 : #, #}", num); 인쇄 만하려면 그러나 string.Format (...)이 더 유용하다고 생각합니다.
Indy9000

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

이와 같은 함수를 사용하여 숫자를 형식화하고 선택적으로 원하는 소수점 이하 자릿수를 전달할 수 있습니다. 소수점 이하 자리를 지정하지 않으면 소수점 이하 두 자리를 사용합니다.

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

십진수를 사용하지만 유형을 다른 것으로 변경하거나 익명 객체를 사용할 수 있습니다. 음의 소수점 이하 자릿수 값에 대한 오류 검사를 추가 할 수도 있습니다.


-2

문화와 잠재적 인 서식 문제에 대해 더 이상 걱정하지 않는 방법은 통화 형식을 지정하고 나중에 통화 기호를 꺼내는 것입니다.

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

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

6
이 코드는 문화권에 독립적이지 않습니다. 코드를 실행하는 컴퓨터에 설정된 기본 문화권을 사용합니다. 이것은 문화가 시작이 아닌 숫자의 끝에 통화 기호를 배치 fr-FR하거나 (예 :) 하나 이상의 문자를 사용하여 통화를 표시 da-DK하거나 (예 :) 쉼표를 사용하여 수천을 구분하지 않는 원치 않는 결과를 생성 할 수 있습니다 (예 : 대부분 유럽 ​​대륙).
raveturned

-2

아래는 자바에서 좋은 솔루션입니다!

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 ??
Smith

올바르게 발견되면 실제로 다음과 같은 통화 인스턴스를 가져 오는 동안 사용됩니다. NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); 코드를 수정했습니다. 감사합니다!
Anirudh

3
태그를 확인 했습니까? 문제는 Java가 아닌 C #에 관한 것입니다!
Salar

-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.