마음의 안정을 찾기 위하여 - FormatFloat보다 3자리 숫자마다 Comma(,)를 넣어 보자.
1868144
33
619
관리자새글쓰기
태그위치로그방명록
별일없다의 생각
dawnsea's me2day/2010
색상(RGB)코드 추출기(Color...
Connection Generator/2010
최승호PD, '4대강 거짓말 검...
Green Monkey**/2010
Syng의 생각
syng's me2DAY/2010
천재 작곡가 윤일상이 기획,...
엘븐킹's Digital Factory/2010
FormatFloat보다 3자리 숫자마다 Comma(,)를 넣어 보자.
Delphi | 2008/03/04 20:34


델파이에서 숫자 3자리마다 콤마(,)를 넣어주기 위해서는 아래와 같이

FormatFloat(',0', someInt);

를 이용하여 처리할 수 있다.

하지만, 정수형 데이터를 콤마 변환 하기 위해서 Float 함수를 사용하는 것은 불필요한 계산 시간을 유발하며, 적은 값의 데이터를 처리한다 치더라도 초당 몇천회의 불필요한 연산이 수행될 수 있습니다.

아래의 함수는 정수만을 받아들여, 콤마 변환합니다.

function IntToStrComma( Value: integer ): string;
var len, i: integer;
    buf: array [0..14] of char;
    isneg: boolean;
begin
     if Value = 0 then
     begin
          Result := '0';
          Exit;
     end;
     asm
        (* EDX:EAX = dividend, EAX = quotient
         * ECX = divisor
         * EDX = remainder
         * EBX = buf offset
         * ESI = counter for inserting commas
         *)
        PUSH EBX // save regs
        PUSH ESI

        XOR EBX, EBX
        MOV EAX, Value // get num
        // negative?
        CMP EAX, 0
        JGE @Positive
        MOV IsNeg, True
        NEG EAX
        JMP @WasNeg
        @Positive:
        MOV IsNeg, False
        @WasNeg:
        // first divide
        CDQ
        MOV ECX, 10
        IDIV ECX
        // ans now in EAX, rem in EDX
        ADD DL, 48 // convert to ascii
        MOV Byte(buf[EBX]), DL
        INC EBX
        MOV ESI, 1 // comma
        @WhileTop:  // WHILE EAX > 0 DO
            CMP EAX, 0
            JE @WhileBottom
            CDQ // these must be done again
            MOV ECX, 10
            IDIV ECX
            // ans now in EAX, rem in EDX

            // comma
            INC ESI
            CMP ESI, 4
            JNE @NoComma
            MOV byte(buf[EBX]), ','
            INC EBX
            MOV ESI, 1
            @NoComma:

            ADD DL, 48 // convert to ascii
            // save to string
            MOV byte(buf[EBX]), DL
            INC EBX
            JMP @WhileTop
        @WhileBottom: // END OF WHILE
        MOV [len], EBX
        //INC [len]
        POP ESI // restore regs
        POP EBX
     end;
     if IsNeg then
     begin
          buf[len] := '-';
          inc(len);
     end;
     (* At this point, buf contains REVERSED string; copy and reverse *)
     SetLength( Result, len );
     for i := 1 to len do
     begin
          Result[i] := Char(buf[len-i]);
     end;
end;

출처 : http://www.codexterity.com/


2008/03/04 20:34 2008/03/04 20:34
Article tag list Go to top
View Comment 0
Trackback URL :: 이 글에는 트랙백을 보낼 수 없습니다
 
 
 
 
: [1] ... [587][588][589][590][591][592][593][594][595] ... [852] :
«   2021/04   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
전체 (852)
출판 준비 (0)
My-Pro... (41)
사는 ... (492)
블로그... (22)
My Lib... (32)
게임 ... (23)
개발관... (3)
Smart ... (1)
Delphi (76)
C Builder (0)
Object... (0)
VC, MF... (9)
Window... (1)
Open API (3)
Visual... (0)
Java, JSP (2)
ASP.NET (0)
PHP (4)
Database (12)
리눅스 (28)
Windows (21)
Device... (1)
Embedded (1)
게임 ... (0)
Web Se... (2)
Web, S... (19)
잡다한... (5)
프로젝트 (0)
Personal (0)
대통령... (9)
Link (2)