Your question, your audience. Choose who sees your identityâ€”and your questionâ€”with question security.

Hi guys,

I need to make a checksum procedure. Can someone help me?

I have a 15 digit number:

Num:=220840001229500

The last 2 digits are zeroes by default.

To get a "control number" I have to perform the following calculation:

I divide Num with 97, thats:

220840001229500:97=2276701043603.09xxxx

Now I have to use the second digit of this result - the 9.

(97+1)-9=89

So 89 is my "control number",

and now at the end, Num: the last 2 zeroes get replaced with the "control number" and Num2: would be

Num2:=2208400012295/89

Greetings, Blash

I need to make a checksum procedure. Can someone help me?

I have a 15 digit number:

Num:=220840001229500

The last 2 digits are zeroes by default.

To get a "control number" I have to perform the following calculation:

I divide Num with 97, thats:

220840001229500:97=2276701

Now I have to use the second digit of this result - the 9.

(97+1)-9=89

So 89 is my "control number",

and now at the end, Num: the last 2 zeroes get replaced with the "control number" and Num2: would be

Num2:=2208400012295/89

Greetings, Blash

Num := 220840001229500;

rTemp := Num / 97;

iDigit := TRUNC(ABS(FRAC(rTemp)) * 100) DIV 10;

iDigit := (97 + 1) - iDigit;

Num2 := (Num DIV 100) * 100 + iDigit;

You will need to declare Num and Num2 as Int64 variables (Longint ain't big enough)

The Neil =:)

var

num,num2,idigit:int64;

rtemp:extended;

begin

Num := strtoint(DBEdit7.Text);{22

rTemp := Num / 97;

iDigit := TRUNC(ABS(FRAC(rTemp)) * 100) DIV 10;

iDigit := (97 + 1) - iDigit;

Num2 := (Num DIV 100) * 100 + iDigit;

end;

TRY

Num := StrToInt(DBEdit7.Text);

EXCEPT

//Do something useful

END;

The Neil =:)

but I get a Error message:

EConvertError with message "220401000207585" is not a valid integer value.

Why?

FUNCTION BigStrToInt(sValue : STRING): INT64;

VAR

iCount : LONGINT;

BEGIN

Result := 0;

FOR iCount := 1 TO Length(sValue)

DO

Result := Result * 10 + StrToInt(sValue[iCount]);

END;

It then just gets called in the same way as IntToStr:

VAR

iNum : INT64;

begin

iNum := BigStrToInt('2204010002075

...

The Neil =:)

I think that your BigStrToInt function works.

But now I get another Error message after running the code block. I get:

EAccessViolation at address...Read of address FFFFFFFF.

I am appending the code now. Can you see something wrong there?

procedure TForm1.Table2BeforePost(Da

var

Num, Num2, idigit: int64;

rtemp: extended;

//Od The Neil

iNum: int64;

//

begin

//moe,ama samo dopola vrsi rabota

// if Pos('4',DBEdit7.Text)>0 then

if Copy(DBEdit7.Text,1,1) = '4' then //Od Mohhamed

begin

ShowMessage('Value must not start with a 4');

Table2.Cancel;

end;

//Od Neil

iNum:=BigStrToInt(DBEdit7.

rTemp:=iNum/97;

iDigit:=TRUNC(ABS(FRAC(rTe

iDigit:=(97+1)-iDigit;

Num2:=(iNum DIV 100)*100+iDigit;

//Od Neil

if iDigit<>89 then

begin

ShowMessage('the bank account is not correct');

Table2.Cancel;

end;

end;

if Copy(DBEdit7.Text,1,1) = '4' then //Od Mohhamed

begin

ShowMessage('Value must not start with a 4');

Table2.Cancel;

Exit;

end;

Beyond that then it's a case of looking at the data. Can you post a value (or values) that are causing problems?

The Neil =:)

After cheking out my question, I saw that I must redefine it. I'll do that later during the day. I'll try that "Exit;" anyway. Thanks for helping me.

Greetings, Blash

The 15 digit number is:

Num:=220840001229500

The last 2 digits are not zeroes by default.

To get the "control number" I have to perform the following calculation:

I divide Num with 97, but I need the reminder, that's:

220840001229500 mod 97, so the reminder is 9.

So now I need this reminder "9" for the "control number":

(97+1)-"reminder"=(97+1)-9

So now my Num2: is:

2208400012295/89

If the "reminder" would be "0" then by default the "control number" would be "89".

I hope I got it right now.

Thanks, Blash

procedure TForm1.Button1Click(Sender

FUNCTION BigStrToInt(sValue : STRING): INT64;

VAR

iCount : LONGINT;

BEGIN

Result := 0;

FOR iCount := 1 TO Length(sValue)

DO

Result := Result * 10 + StrToInt(sValue[iCount]);

END;

VAR

iValue : INT64;

iResult : INT64;

sValue : STRING;

begin

sValue := '220840001229500';

//Get the stribg into an integer

iValue := BigStrToInt(sValue);

//We're only interested in the final two digits for calculating the checksum

//BUT we need remember the rest of the value (minus the last two digits) so

//strip off the last two digitd by dividing by 100

iResult := iValue DIV 100;

//Divide the COMPLETE value by 97

iValue := iValue MOD 97;

//Calculate the checksum

iValue := (97 + 1) - iValue;

//Add the two checksum digits to the end of the value

//iResult is the original number but with the last two digits stripped. If we

//add on two extra zeroes (by multiplying by 100), we can then add the

//checksum value straight onto the end to give us a final value

iResult := iResult * 100 + iValue;

ShowMessage('Result: ' + IntToStr(iResult));

end;

The Neil =:)

The code works prefectly, only one thing:

How can I say in code at the place where:

sValue:='220840001229500';

take care only for the first 13 digits,leave the 14th and 15th alone (thats taken care later with:

iResult:=iResult*100+iValu

Thanks Blash ;)))

The Neil =:(

So sorry that I'm nagging you with my stupid question. You have more then deserved my pityful 50 points. Have you had a nice weekend? I hope this would be the last that you hear from me - concerning this question.

Your code works perfectly for me if I, for example, have this number:

220401000207682, but only if I enter it as:

220401000207600.

In fact I need, after running your procedure that:

sValue: would be the same as iResult:

I hope I've explained it now.

Sincerely, Blash

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.

What you need then is this:

procedure TForm1.Button1Click(Sender

FUNCTION BigStrToInt(sValue : STRING): INT64;

VAR

iCount : LONGINT;

BEGIN

Result := 0;

FOR iCount := 1 TO Length(sValue)

DO

Result := Result * 10 + StrToInt(sValue[iCount]);

END;

VAR

iValue : INT64;

iResult : INT64;

sValue : STRING;

begin

sValue := '220401000207682';

//Get the stribg into an integer

iValue := BigStrToInt(sValue);

//We're only interested in the final two digits for calculating the checksum

//BUT we need remember the rest of the value (minus the last two digits) so

//strip off the last two digitd by dividing by 100

iResult := iValue DIV 100;

//Divide the COMPLETE value by 97

iValue := ((iValue DIV 100) * 100) MOD 97;

//Calculate the checksum

iValue := (97 + 1) - iValue;

//Add the two checksum digits to the end of the value

//iResult is the original number but with the last two digits stripped. If we

//add on two extra zeroes (by multiplying by 100), we can then add the

//checksum value straight onto the end to give us a final value

iResult := iResult * 100 + iValue;

ShowMessage('Result: ' + IntToStr(iResult));

end;

Although it looks to be just about the same code, it's now replacing the final two dogits with zeroes BEFORE doing the checksum calculation. After it's done the calculation it then just replaces the final two dogots with the checksum value. Hope that's what you needed

The Neil =:)