developer tip

Int32.ToString () 문화권에 따라 다르나요?

optionbox 2020. 11. 21. 14:12
반응형

Int32.ToString () 문화권에 따라 다르나요?


ReSharper 베타 버전을 실행 중이며 다음 코드에 대한 경고가 표시됩니다.

int id;
// ...
DoSomethingWith(id.ToString());

경고가 id.ToString()호출 중이며 "명시 적으로 문자열 변환에서 문화를 지정하십시오" 라는 메시지가 표시됩니다 . 나는 경고를 이해하고 그것을 고치는 방법을 알고 있습니다. 코드를 훨씬 다루기 힘든 것으로 변경하십시오 id.ToString(CultureInfo.InvariantCulture).

하지만 제 질문은 이것이 필요한가요? 내 말은, DateTime(다른 문화는 다른 날짜 형식을 가짐) 및 Double(소수점에 사용되는 다른 문자 )와 같은 유형을 사용할 때 문화를 지정하는 것이 중요합니다 . 그러나 Int32.ToString()적어도 en-US 및 고정 문화권에서는 서식을 전혀 추가하지 않습니다. 쉼표, 소수점, 달러 기호, 아무것도 없습니다. 그렇다면 문화마다 무엇이 다를까요?

매개 변수 없음을 호출 할 때 실제로 일종의 서식을 추가 하는 문화가 Int32.ToString()있습니까? 아니면 ReSharper 베타의 버그이며이 경고가 실제로 적용되지 Int32않습니까 (이 경우 ReSharper 버그 보고서를 제출합니다)?


운영 체제는 숫자 음수 부호 를 변경할 수 있습니다.

Control panel -> 
   Language and regional settings -> 
         Additional settings -> 
             Negative sign

따라서 현재 문화는 음수 기호를 무시할 수 있습니다. 이 경우 지역 설정을 존중해야합니다. 이것이 경고의 이유입니다. 프로그래밍 방식으로 음수 부호를 변경할 수도 있습니다.

    CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    // Make a writable clone
    culture = (CultureInfo) culture.Clone();
    culture.NumberFormat.NegativeSign = "!";

임의의 int 샘플에서 테스트 한대로 Windows ( CultureTypes.InstalledWin32Cultures) 와 함께 설치된 352 개의 문화권 모두 동일한 결과를 제공합니다.

Daniel은 사용자 지정 문화가 음수에 다른 접두사를 사용할 수 있다는 점을 지적하는 것이 옳지 만 실수로 저장하여이 기능을 사용한 사람은 의심 스럽습니다.

.NET 개발자가 float 및 다른 유형과 일치하도록 한 것 같습니다. 그들은 또 무엇을 기대하고 있었습니까?

> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....

예. 그것은 현재의 문화에 달려 있습니다. 로부터 MSDN의 문서 :

반환 값은 일반 숫자 형식 지정자 ( "G")와 현재 문화권에 대한 NumberFormatInfo 개체로 형식이 지정됩니다 .

내 강조

Resharper는 사용하려는 문화에 대해 명시하기를 원할 것입니다. 생략하기 때문에 다른 시스템에서 실행될 때 변경 될 수있는 동작에 의존합니다.


이상합니다. 50.ToString (CultureInfo.CreateSpecificCulture ( "ar-AE"))가 "٥٠"를 반환 할 것으로 예상했지만 그렇지 않습니다.

나는 이것을 방금 보았고 문제는 NumberFormatInfo.DigitSubstitution 이 실제로 구현되지 않은 것 같습니다.

DigitSubstitution 속성은 향후 사용을 위해 예약되어 있습니다. 현재는 현재 NumberFormatInfo 개체에 대한 구문 분석 또는 서식 지정 작업에 사용되지 않습니다.

따라서 열거 형 System.Globalization.DigitShapes가 있지만 실제로는 IFormatProvider의 NumberFormatInfo 비트에서 구현되지 않습니다.


아니오라고 말했지만 MSDN Int32.ToString () 확인하면 다음과 같습니다.

반환 값은 일반 숫자 형식 지정자 ( "G")와 현재 문화권에 대한 NumberFormatInfo 개체로 형식이 지정됩니다.

그래서 놀라운 것이 있습니다.

질문은 왜 현재의 Resharper가 이것을 제안하지 않는 것입니까?


정수는 2,147,483,647만큼 높을 수 있기 때문입니다.

일부 국가 에서는 쉼표 대신 소수 또는 공백을 사용합니다.

참고 URL : https://stackoverflow.com/questions/8492449/is-int32-tostring-culture-specific

반응형