Avalonia 를 이용하여 C#으로 개발하던 중 겪은 일입니다.
Windows의 경우 ‘국가 또는 지역 - 형식 사용자 지정’ 의 소수점 기호에 따라,
Linux의 경우 Locale에 따른 decimal_point 에 따라 소수값을 인식하는 것 같습니다.
예를 들어,
string myText = “123.456” 이라 했을 때, 
지역이 ko-KR인 제 pc에서는 Convert.toDouble(myText) 가 double 123.456 이 되는데
지역이 Vi (베트남어)인 경우에는 double 123456 으로 원하던 값과 1000배 차이 나는 상황이 나오네요.
코드를 짜는 프로그래머들은 소수 값을 쓰는 방식이 언어의 약속일테니
double myValue = 123,456 같이 콤마 ( , ) 로 쓰지는 않을테니 상관없을텐데
일반 유저들이 TextBox 등으로 글자로 입력한 소수값을 double / decimal 등으로 변환 할 때
표시 형식에 따라 의도하지 않은 값이 나오는 경우가 있을텐데
이런 경우 보통 어떤식으로 처리하는 것이 가장 좋을까요?
             
            
               
               
              1개의 좋아요 
            
           
          
            
            
              다국어 환경이면, 아래의 코드가 정석일 것 같습니다.
if (double.TryParse(textFromUI, CultureInfo.CurrentUICulture, out var number))
{
   // 
}
 
             
            
               
               
              3개의 좋아요 
            
           
          
            
            
              decimal 이나 float 값을 ToString() 으로 변환할 때
number.ToString( CultureInfo.InvariantCulture ) 으로 문자열을 받아와야
표시형식이 바뀌었을 때와 상관없이 변환이 되네요.
val = 15.0 일 때,
Convert.toInt32 ( val.toString() ) 을 콤마 표시형식 일 때 하게 되면, Convert.toInt32 ( 15,0 ) 으로
150 이 나오는 경우가 생기네요.
VS 디버거와 시스템 표시형식이 서로 다르게 적용되어서 디버거 상에는
toString() 이나 toString(CultureInfo.InvariantCulture) 나 똑같이 15.0 이 나오는데
실제로는 시스템 표시형식에 따라 return  되는 string 이 다른가 봅니다.
             
            
               
               
               
            
           
          
            
            
              
 hsjeong:
 
decimal 이나 float 값을 ToString() 으로 변환할 때
number.ToString( CultureInfo.InvariantCulture ) 으로 문자열을 받아와야
표시형식이 바뀌었을 때와 상관없이 변환이 되네요.
 
 
베트남 사용자가 “123.456” 라고 입력했을 때는 123.456 아니고, 123456 을 의미할 것입니다. 
그걸 123.456 이라고 받아 들이면, 처리 오류이지 않을까요?
             
            
               
               
               
            
           
          
            
            
              말씀해주신 방법으로 입력할 때 처리하는건 잘 해결했습니다.
이후에, 변환된 소수 값을 config 로 쓰기 위해서 텍스트 파일로 저장하려 했는데, 
소수값 123.456 을 한국컴퓨터에서 저장할 때는 123.456으로 저장 되고 
베트남 컴퓨터에서 저장할 때는 123,456 으로 저장되는데 
반대로 이걸 불러올 때도 서로 값이 바뀌는 경우가 발생하더라고요.
그래서 최종적으로 config 텍스트 파일에 값을 쓰기 위해서는 저장하거나 불러올 때는 고정된 형태로 저장하거나 받아와야 편리한 것 같습니다.
             
            
               
               
              2개의 좋아요 
            
           
          
            
              
                code  
                
               
              
                  
                    9월 24, 2025, 12:41오전
                   
                   
              6 
               
             
            
              저희랑 같은 이슈가 생기셨네요 ㅎㅎ
저희도 베트남어 지원을 하게 되면서
내부적으로 쓰고 있는 double.TryParse 와 ToString에서 같은 문제가 있었습니다.
생전 첨으로 . 을 , 로 쓰는 문화권이 있다는거도 알게 되었습니다. ( 프랑스…)
저희의 해결 방법은
그쪽 문화권 사람들도 프로그램 쓸때는 , 대신에 . 쓰는거에 어느정도 알고 있다고 전해 들어
(순전히… 우리 편하자고… 야매로…)
Thread.CurrentThread.CurrentCulture
는 en-US로 강제 고정 하고
Thread.CurrentThread.CurrentUICulture
만 설정 언어로 하여 화면 다국어 지원으로 처리 하였습니다.
             
            
               
               
              2개의 좋아요