2009-09-28 4 views
13

내 응용 프로그램의 특정 숫자가 구분 기호 나 그룹화없이 현재 환경과 상관없이 인쇄되고 있는지 확인하고 싶습니다. 다음 두 가지 방법으로 동일한 결과가 나온 것으로 보입니다 (더 많은 가능성이 있습니다) :ToString ("0") 대 ToString (CultureInfo.InvariantCulture)

123456789.ToString("0"); 
123456789.ToString(CultureInfo.InvariantCulture); 

가장자리의 흠집이나 단점이 있습니까? 어느 것이 더 정확합니까? 어느 것을 사용 하시겠습니까?

나는 두 번째 것을 사용했지만, 최근에는 첫 번째 것을 찾았고 추가로 using System.Globalization을 필요로하지 않으므로 사용하기 시작했습니다.

답변

0

당신은 내가 개인적으로 첫 번째 옵션은 당신이 생각하는 "무엇을 상관없이, 어떤 형식"을 지정하지 있는지 확인하고자하는 경우 :

123456789.ToString("0"); 

더 나은 의도를 전달합니다. 단점은 문화권이 사용중인 숫자 유형에 대해 형식 문자열 "0"을 초과하는 경우입니다.

+0

아, 이제 형식 문자열을 대체 할 수 있음을 알고 계십니까? 나는 그것을 찾아야한다. –

+0

오버로드가 확실합니까? MSDN (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx)은 다음과 같이 말합니다. "다른 표준 문자 중 하나가 런타임에 FormatException을 throw합니다." –

+0

나는 이것이 사실인지 아닌지 확실하지 않았다. 나는 MSDN 도서관으로의 빠른 여행을 보았을 것이다. –

2

처음 보는 형식은 컴퓨터의 기본 문화권을 사용하는 문자가 하나 이상인 숫자입니다. 두 번째는 InvariantCulture 규칙에 따라 숫자로 서식을 지정합니다.

바비

+0

내가 틀렸다면 나를 정정하십시오 : 123456789.ToString ("0")에 숫자 그룹화, 구분 기호가 적용되지 않는다고 생각합니까? –

+0

어 ... 정말 그렇지 않습니다. 나는 "N0"와 같은 형식화 기호로 오인했는데 현재 문화 규칙을 적용합니다. 당신은 맞습니다. 0은 직접 서식을 지정하기 때문에 _any_ culture 정보를 적용하지 않습니다. 누군가가 123456789.ToString()을 사용할 수도 있지만, . – Bobby

5

두 가지 방법은 동일하지 : 제는 CurrentCulture를 사용한다. 특정 문화권에서는 여분의 점/쉼표로 이어질 수 있습니다 (예제가 없습니다).

InvariantCulture를 사용할 때 항상 동일한 서식이 사용된다는 것을 확신합니다.

편집 : 그리고 CodeAnalysis를 사용하면 CultureInfo를 사용하지 않을 때 불평 할 것입니다.

+0

현재 스레드 문화권을 수정하여 첫 번째 테스트를 실시했지만 테스트에 영향을 미치지 않았습니다. 나는 "0"이 의미하는 것 : 적어도 하나의 숫자 + 숫자 그룹화 또는 구분 기호 없음. 일부 숫자 그룹화 또는 구분 기호를 사용하려면 "000,000"과 같은 것을해야한다고 생각합니다. –

+2

하지만 당신 말이 맞습니다 : InvariantCulture는 더 명백합니다. 심지어 MSDN은 "... 영어와 관련이 있지만 어떤 국가/지역과도 관련이 없습니다"라고 말합니다. 흠, ToString (CultureInfo.InvariantCulture)에 대해 더 많이 생각하면 "G"를 사용하여 숫자가 포맷 된 것입니다. "G"가 그룹화를 사용하지 않는 것 때문에 모두 작동합니다. 하지만 불변 문화에는 특정 그룹이 지정되어 있습니다. 예를 들어, 12345789.ToString ("N", CultureInfo.InvariantCulture)을 시도하십시오. –

17

답변과 토론을 토대로 좀 더 조사했습니다. 여기 내가 찾은 것입니다 : 당신이 인수없이 12345678.ToString()를 사용하는 경우, .NET은 NumberFormatInfo.NegativeSign,하는 NumberFormatInfo에 의해서만 영향을받는 일반 형식 지정자 "G" 일반적으로 사용

  • . NumberDecimalSeparator, NumberFormatInfo.NumberDecimalDigits 및 NumberFormatInfo.PositiveSign입니다. 나에게 이것은 어떤 문화권에서도 12345678.ToString()은 항상 "12345678"을 만들어야한다고 말합니다. 당신이 별도의 자리하려면

  • , 당신은 숫자 형식 지정자를 사용하는 "N" (또는 물론, 사용자 지정 형식 문자열을 제공하기 위해)가 필요합니다. 숫자 그룹화는 "C"및 "P"에도 적용됩니다.

  • 불변 배양 실제로 (물론, 숫자 3에 의해) 그룹핑 및 자리 디지트 세퍼레이터를 지정 않는다. 따라서 123456789.ToString(CultureInfo.InvariantCulture)이 "123456789"를 생성하는 이유는 불변 문화 때문에 발생하는 것이 아니라 기본 일반 숫자 형식 지정자 "G"때문입니다.

은 그래서 결론은 여분의 인수에 대한 걱정 그냥 사용하지 완벽하게 OK 있다는 것을 말할 것입니다 :

12345678.ToString() 

내가 생각하는 모든 경우에서이 최고 그 대부분의 인쇄/쓰기 함수가 모든 종류의 인수를 받아들이고 ToString()을 수행하기 때문에 일반적으로 ToString()을 호출 할 필요가 없다는 것을 의미하기 때문입니다.

1

2 줄이 서로 다른 것을합니다. 첫 번째 줄은 로컬 문화권의 숫자를 서식 지정하고 두 번째 줄은 서식을 지정하지 않고 CultureInfo.InvariantCulture를 사용하여 문자열로 변환합니다.

이러한 종류의 메소드 (ToString, ToLower ...)를 사용하여 CultureInfo.InvariantCulture를 사용하면 어떤 소프트웨어 (데이터베이스, 다른 라이브러리 ...)에서 값을 사용할 때 문화가 무엇이든간에 , 같은 값이되고이 값을 선택할 수있게되면 처리를 계속할 수 있습니다. 그러나 이것을 사용하지 않으면 다른 소프트웨어가 귀하의 문화가 무엇인지 알아 내야합니다. 쉼표 또는 다른 문자로 소수점 구분 기호를 사용 했습니까?

모두가 라이브러리, 데이터베이스간에 값을 교환/사용하고 CultureInfo.CurrentCulture를 사용하여 응용 프로그램 사용자에게 표시하려면 CultureInfo.InvariantCulture를 사용하십시오.

// for softwares 
string mystring1 = 1234.ToString("0", CultureInfo.InvariantCulture); 

// for your application users 
string mystring2 = 1234.ToString("0", CultureInfo.CurrentCulture); 
1

(5 ~ 년 후 ...)

나는이 정확한 질문을 찾고 있지만 허용 대답 심지어 월 Zich 불구하고이 없었기 때문에 내가 함께 조금 넣어 것이라고 생각 정확했다

이것을 테스트하는 예제.

.ToString(), .ToString ("0") 및 .ToString (모든 문화 정보) (차이는 정수와 소수 자릿수에 관한 한) 사이에는 차이가 없다고 말할 수 있습니다.

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures) 
    .Except(CultureInfo.GetCultures(CultureTypes.SpecificCultures)); 

foreach(var c in cultures){ 
    var num = (int.MinValue);/* 
    var num = (int.MaxValue);/* 
    var num = (decimal.MinValue);/* 
    var num = (decimal.MaxValue);/* 
--*/ 

    var s1 = num.ToString("0") ; 
    var s2 = num.ToString(c); 
    if(s1 != s2){ 
     var s = string.Format("{2}: {0} {1}",s1,s2,c); 
     s.Dump(); 
    } 
} 

LinqPad snippet

0

로 .toString()로 .toString (CultureInfo.InvariantCulture)은 항상 정수에 대해 동일한 결과를 제공.

아래 코드는 내 PC에 결과 "0 차이가을 발견, (809) 문화가 테스트 '제공 :

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures).ToArray(); 
var numbers = new[] { 0, -1, 1, int.MinValue, int.MaxValue }; 

var diffsFound = 0; 
foreach (var culture in cultures) 
{ 
    foreach (var number in numbers) 
    { 
     var s1 = number.ToString(); 
     var s2 = number.ToString(culture); 
     if (s1 != s2) 
     { 
      Console.WriteLine($"{culture.DisplayName}: {s1} != {s2}"); 
      diffsFound++; 
     } 
    } 
} 

Console.WriteLine($"{cultures.Length} cultures tested, {diffsFound} differences found.");