Formula to convert Hexadecimal to decimal numbers and Decimal numbert to Hexadecimal

I am looking for a function or formula to convert hexadecimal numbers to decimal and Decimal numbert to Hexadecimal
In Excel I use the "HEX2DEC" and "DEC2HEX" functions but I don't see any similar functions in Crystal.

Value in hexadecimal Value in decimal
0x0001      1
0x0002      2
0x0008      8
0x0010      16
0x0020      32
0x0040      64
0x0080      128
0x0100      256
0x0200      512
0x0800      2048
0x1000      4096
0x2000      8192
0x10000      65536
0x20000      131072
0x40000      262144
0x80000      524288
0x100000      1048576
0x200000      2097152
0x400000      4194304
0x800000      8388608
0x1000000      16777216

If I have a decimal number of 66050 the Hexdecimal equivalent is  10202

I am using Crystal Pro 10.  My datasource is a CSV file.


Gus Darino
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

This formula converts a Hex string parameter (RefNumber) to a decimal value:

// Hex To Dec
numberVar x := len({?RefNumber});
numberVar base16 := 1;
numberVar value := 0;
numberVar decval := 0;
stringVar s;

while x > 0 do
    s := mid({?RefNumber},x,1);
    if s = "F" then
        decval := 15
    else if s = "E" then
        decval := 14
    else if s = "D" then
        decval := 13
    else if s = "C" then
        decval := 12
    else if s = "B" then
        decval := 11
    else if s = "A" then
        decval := 10
        decval := cdbl(s);

    value := value + (base16 * decval);
    base16 := base16 * 16;
    x := x - 1;




Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
This formula takes you the other way - from decimal to hex.  As far as I know there's no built in Crystal function so you'll have to use your own formulas to do the calculations.

  stringVar result;
  numberVar digit;
  numberVar decval;
  numberVar hexval;
  stringVar hvalue;

  decval := {table.field};
  for digit := 10 to 1 step -1 do
     hexval := int( decval / (16 ^ digit));
     decval := decval - (hexval * ( 16 ^ digit ));
     if hexval < 10 then
        hvalue := cstr(hexval)
        select hexval
           case 10: hvalue := 'A'
           case 11: hvalue := 'B'
           case 12: hvalue := 'C'
           case 13: hvalue := 'D'
           case 14: hvalue := 'E'
           case 15: hvalue := 'F'
      result := result + hvalue;          

Note that this formula has a hard coded 10 digit result so you'll always have 10 digits (with padded zeros as needed).  If you don't want the extra zeros on the front then change this line:

if hexval < 10 then

to this

if hexval < 10 and hexval > 0 then

and then in the case statement add a case to handle zero:  case 0: hvalue := '';  


gusdarinoAuthor Commented:

Thank you for your help!

The formula to convert from Hex to Dec works fine.  
There is a problem with the formula to convert from Dec to Hex.  If the reference value is 514 the Hex should be 0202 but I get 0020 wich is hex for dec 32.  If i enter 512 I get 0020 which is wrong as well.

Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

Sorry - I converted this from an Oracle function that I'd written and I made a translation error.  Change these two lines:

     hexval := int( decval / (16 ^ digit));
     decval := decval - (hexval * ( 16 ^ digit ));

To this:

     hexval := int( decval / (16 ^ (digit-1)));
     decval := decval - (hexval * ( 16 ^ (digit-1)));

That should get rid of the shifted values.

gusdarinoAuthor Commented:
Works like a charm!

Thank you very much!

Gus Darino
gusdarinoAuthor Commented:
Thanks, I just got through a 3 month process of evaluating different report and BI solutions for my company so I had it fresh in my mind.  :-)
Glad to help - frodoman
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Crystal Reports

From novice to tech pro — start learning today.

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.