在哪里可以找到System.Val的实现?

时间:2019-04-30 11:46:50

标签: delphi

是否有找到内在函数System.val(..)的实现的方法?

此函数仅与 unicodeString 一起使用,我想使其与 AnsiString 一起使用... ...该函数是否可以替换为与 ansiString

1 个答案:

答案 0 :(得分:1)

如果仅 个十进制数字,个正数和检查溢出(因为您知道它永远不会发生),则您可以使用以下功能:

FUNCTION TryAnsiStrToInt(CONST S : AnsiString {EAX} ; OUT Value : Cardinal {EDX} ) : BOOLEAN; ASSEMBLER;
  ASM
                PUSH    ESI
                MOV     ESI,EAX         // ESI = String
                XOR     ECX,ECX         // ECX = Value
                CLD
                XOR     EAX,EAX         // Clear upper 24 bits of EAX
        @LOOP:  LODSB                   // Load character
                OR      AL,AL           // End-of-String?
                JZ      @OK
                SUB     AL,'0'          // Convert ASCII to Binary
                JB      @ERR            // Out of range
                CMP     AL,9
                JA      @ERR            // Out of range
                IMUL    ECX,10          // ECX:=ECX*10
                ADD     ECX,EAX         // ECX:=ECX+EAX (ie. Value:=Value*10+Digit)
                JMP     @LOOP           // Next character
        @ERR:   XOR     AL,AL           // Error: Return FALSE
                XOR     ECX,ECX         // and Value:=0
                JMP     @OUT
        @OK:    MOV     AL,1            // Success return TRUE
        @OUT:   MOV     [EDX],ECX       // and Value
                POP     ESI
  END;

如果您还有其他要求(负数,十六进制数,溢出检查等),则需要对功能进行调整以解决这些问题……