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

问题描述 投票:-3回答:1

有没有办法找到内在函数System.val(..)的实现?

这个函数只适用于unicodeString,我想让它也可以使用AnsiString ...是否有替换这个与ansiString一起使用的函数?

delphi
1个回答
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;

如果您有其他要求(负数,十六进制数,溢出检查等),您需要调整功能以照顾这些......

© www.soinside.com 2019 - 2024. All rights reserved.