Float.Parse not in a correct format 문화권 문제

 

#. 숫자 변환에서 오류가 발생하다

게임 개발 중 데이터를 다루다 보면 string에서 float로 파싱 하여 사용하는 경우가 자주 발생한다.

예를 들어, 특정 시간 동안 진행되는 이벤트를 구현하는 경우 다음과 같은 코드를 사용할 것이다.

string squenceStr = "0.3";
float time = float.Parse(squenceStr);

 

너무 당연한 코드고 문제 될 것 없어 보인다.

한국이나 미국 같은 일반적인 문화권에서 서비스하는 경우라면 말이다.  

 

 

숫자 표기는 나라에 따라 다르다!

 

 

한 모바일 게임을 라이브 서비스하던 중, 당신의 게임은 러시아 시장에 진출하기로 결정했다.

러시아 쪽 로컬라이징도 완료했고, 기기 테스트로도 러시아어로 문제없이 동작하는 것까지 확인했다.

 

그러나 출시를 한 뒤, 러시아 유저들로부터 게임이 정상적으로 작동하지 않는다는 피드백을 받게 될 것이다.

float.Parse의 동작은 기기의 디바이스 언어에 따라 다르기 때문이다!

정확히는 기기의 문화권에 따라서 다르다.

 

 

일백 이십 삼만 사천 오백 육십 칠 점 팔 구 

미국이나 한국에서는 아래와 같이 표기하고

1,234,567.89
러시아나 브라질 독일 등에서는 아래와 같이 표기한다.
1.234.567,89

 

 

string의 형태는 한국기준으로 써져있는데, 기기는 러시아 기준으로 소수점 변환하려고 때문에 아래와 같이 형식이 맞지않다고 오류가 발생한 것. 

Exception: FormatException: Input string was not in a correct format.
System.Number.ParseSingle (System.String value, System.Globalization.NumberStyles options, System.Globalization.NumberFormatInfo numfmt) (at <00000000000000000000000000000000>:0)

 

 

#. 해결방법

- float.Parse를 사용할 때 문화권을 구분하지 말라고 지정하면 된다.

float.Parse("6.59", CultureInfo.InvariantCulture);

- TryParse의 경우에는 아래와 같이 사용하면 된다.

float.TryParse(value, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out result);

 

 

평소에는 인지하지 못하고 개발하다가 소수점 표기가 다른 문화권 + string에서 float로 변환하는 함수를 사용의 특수한 조건에서 발생하기 때문에 실수하기 딱 좋다..

 

유니티에서 많이 쓰이는 에셋인 DoTween 같이 파싱을 사용하는 에셋들의 코드를 뜯어보면 역시나 문화권에 영향을 받지 않도록 대비되어있다.

 

테스트 할때는 기기의 언어와 지역을 해당 문화권으로 바꿔준뒤 실행하면 된다.

 

#. 마치며

- 언어권 문제는 float.Parse 말고도 DataTime.ToString()이나 Char.ToLower()등에서도 발생할 수 있다. (일부국가는 문자를 다르게 쓰기도한다.)

 

 

 

댓글

Designed by JB FACTORY