有没有办法找到内在函数System.val(..)
的实现?
这个函数只适用于unicodeString,我想让它也可以使用AnsiString ...是否有替换这个与ansiString一起使用的函数?
如果只有十进制数字,只有正数,并且没有检查溢出(因为你知道它永远不会发生),那么你可以使用以下函数:
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;
如果您有其他要求(负数,十六进制数,溢出检查等),您需要调整功能以照顾这些......