퇴근5분전

 

오늘 ( 2015-10-02 ) CodeProject 갔더니.

http://www.codeproject.com/Tips/1035207/Number-Only-Behaviour-for-WPF

 

내가 만든 프로그램 버그 : Ctrl + C눌렀는데 복사가 안되고 붙여넣기가 된다?

>> 집에서 수정해놓았던 소스는 C , V 코드가 이미 수정되어 있네...

 

>> 숫자 이외에 붙여넣기 할때 붙여지는 현상

  SetValue 에서 valueString의 데이타 타입확인 후 변환 후 콤마 찍고 바인딩 하도록 수정함!

 

#########################################################################

 

WPF Numeric 컨트롤이 없을줄이야 ㅡ.,ㅡ^

 

구글링 해도 없네..?

 

거기다가 ... ErrorProvidor가 없어 ㅡㅡ;?

 

예제들이 모두 바이딩을 해야 되다뉘???

 

 

 

 

쨔안!~~~ 만들었다.

 

컨트롤을 만들었다기 보다.. Textbox에 Template 을 이용해서 만들었다.

 

위 예로는 5, 2 <-- Numeric( 5, 2 ) 로 만들어진 컬럼을 대상으로 컨트롤 입력/출력을 함!!

 

입력할때마다 콤마 콤마가 자동으로 위치잡고 소수점 찍으면 뒤로는 한자리씩 교체되고...

 

유효성 체크도 한방에 주르륵... 처리 해주고..

 

이게 컨트롤로 만든게 아니라서 ... 뭐... 필요할때쯤 되면 만들어 보든가~

 

### 디버깅..

 

 

 

ReadOnly 스타일을 넣었고,

정수만 처리할때 - 자리를 처리 하지 않도록 뺌.

Control + c, v, x 처리.

 

디버깅을 하다가 예상하지 못한 일을 격었다.

 

SetValue( NumberText1, 99999999.99999999999 )   로 지정하였을때!!

 

double 인데 문자열로 변환 했더니 반올림이 되어서 나온다?

 

음... 일단 컨트롤에 자리수가 8, 2 이기 때문에 소수 2자리 뒤에 문자들은 반올림 없이 잘라내려고

 

문자열로 만드는 과정에서 당황했었다.

 

찾은 방법은 r !! n, d, x등등 봤는데... r... 이건 반올림 없이 문자열로 만들어준다.

뒤에 자르고 콤마를 넣어주며 마무리!!!

 

### 수정본 ### 소수점처리가 잘못되어있었넹... , 파라미터 부분에서 포맷도 제거 함.

 

private string GetNumberFormat(object dm, NumericTextBoxInfo info)
        {
            string number = "" + dm;

            if (info.Scale > 0)
            {
                // 소수점뒷자리를 잘라냄.
                if (number.IndexOf('.') >= 0)
                {
                    string[] nums = number.Split('.');
                    number = nums[0] + ".";
                    if (nums[1].Length > info.Scale)
                    {
                        number += nums[1].Substring(0, info.Scale);
                    }
                    else
                    {
                        number += nums[1].PadRight(info.Scale, '0');
                    }
                }
                else
                { 
                    number = number + "." + "".PadRight(info.Scale, '0');
                }
            }
            else
            {
                if (number.IndexOf('.') >= 0)
                {
                    number = number.Remove(number.IndexOf('.'));
                }
            }
            /*뒤에서부터 콤마 찍고 온다..*/
            int start = number.Length;
            if (number.IndexOf('.') > 0) {
                start = number.IndexOf('.');
            }

            for (int end = start - 3; end >= 0; end -= 3 )
            {
                number = number.Insert(end, ",");
            }

            return number.TrimStart(',');
        }

 

 

하핫.. 재미있당.

 

소스 hidden~ ( 갱신 20150915 )