是否有找到内在函数System.val(..)
的实现的方法?
此函数仅与 unicodeString 一起使用,我想使其与 AnsiString 一起使用... ...该函数是否可以替换为与 ansiString ?
答案 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;
如果您还有其他要求(负数,十六进制数,溢出检查等),则需要对功能进行调整以解决这些问题……