double.Parse("1.5")→FormtException←는?
TL;DR
.NET
Parse
와 TryParse
는 PC의 언어 설정에 따라 동작이 달라지므로 외국에서 실행될 가능성이 있는 경우 두 번째 파라미터를 지정하십시오.재현 코드
다음 코드로 재현할 수 있습니다.
using System.Globalization;
using System.Threading;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
double.Parse("1.5"); // FormatException
.NET Fiddle 실행 무슨 일이 있었는지
일본에서는 소수점을 나타내는 기호
.
(마침표)로 쓰이지만 국가에 따라 때로는,
(쉼표)나٫
(Momayez)로 표시하기도 한다.[1] .NET는 이를 고려해 언어 설정
Parse
등에 따라 행동이 달라진다.재구성 코드에서, 라인의 언어 설정이 프랑스로 변경되었습니다.
프랑스에서는 일반적으로 소수점
,
을 정수의 세 자리 구분자.
로 사용한다.정수 3자리의 구분자가 완전하지 않기 때문에 예외가 발생한다.
해결책
Parse
또는 TryParse
의 두 번째 파라미터를 전달IFormatProvider
한 후 언어 설정에 상관없이 파라미터 언어로 해석한다.여기
CultureInfo.InvariantCulture
를 통해 PC의 언어에 따라 설정하지 않음소수점
.
, 정수의 세 자리 구분자,
.using System.Globalization;
using System.Threading;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
double.Parse("1.5", CultureInfo.InvariantCulture); // 1.5
방지책
Visual Studio의 코드 분석 경고CA1305가 있기 때문에 코드 분석 경고를 보면 사고를 미연에 방지할 수 있다고 생각합니다.... 하지만 제 환경에서 경고를 보내지 않았기 때문에 무엇을 설정할 필요가 있습니까?
현재는 지퍼를 준비해서 저쪽을 사용하거나 검출할 수 있는 제3자가 만든 분석기를 찾아서 가져올 수 있다.
각주
소수점 - 위키백과 ↩︎
Reference
이 문제에 관하여(double.Parse("1.5")→FormtException←는?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/proudust/articles/2020-09-18-csharp-parse-culture텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)