TCHAR to int

Ah hello.

This seems like it should have a simple solution, but I cannot find it.  I have a single TCHAR, obtained from CString::GetAt.  I need to convert it to an integer.

I cannot use _ttoi as that requires a TCHAR* not a TCHAR.

How can I convert a single character?

TIA
LVL 19
mrwad99Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
Jaime OlivaresConnect With a Mentor Software ArchitectCommented:
not sure what you need
if you want to convert just 1 character to int, then:
int i = (int)a - 48;
0
 
Deepu AbrahamR & D Engineering ManagerCommented:
ttoi() -  did you try this?

Best regards,
DeepuAbrahamK
0
 
Jaime OlivaresSoftware ArchitectCommented:
just do a casting operation:

TCHAR a = somestring.GetAt(5);
int i = (int)a;
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Deepu AbrahamR & D Engineering ManagerCommented:


int i = _ttoi((LPCTSTR)tchardata);

Try this way of casting as well
0
 
mrwad99Author Commented:
Jaime:

      CString str ( _T("1") );
      TCHAR ch = str.GetAt ( 0 );
      int n34 = ( TCHAR ) ch;

This sets 'n34' to 49, not 1.

DeepuAbrahamK:

      CString str ( _T("1") );
      TCHAR ch = str.GetAt ( 0 );
      int n34 = _ttoi ( ( LPCTSTR )ch );
      

This crashes.

???
0
 
mrwad99Author Commented:
>> if you want to convert just 1 character to int, then:

Yes that is exactly what I need.  I get a TCHAR from CString::GetAt(), which I then need to convert to an int.  As I said above, I cannot use _ttoi as that requires a TCHAR* parameter, not a TCHAR.

>> int i = (int)a - 48;

That does the trick.  Can you explain why please, and can I 100% rely on this with UNICODE/non UNICODE apps ?
0
 
Jaime OlivaresSoftware ArchitectCommented:
the '0'  digit has always a value of 48, in both ASCII/ANSI and Unicode.
following numbers values are 49,50,etc.
So, this always will be true.

Just you have to handle what to do, when the caracter is not a digit, that is, with a value lower and 48 or greater than 57

0
 
mrwad99Author Commented:
OK, after consideration I understand that: if I output a character A via

int i = (int)a - 48;

I get 17.  Hence the need for the range test.  Interestingly, after looking on http://www.asciitable.com/, I see that 17 is not the decimal of 'A'.  Can you tell me why this please?  (Points up 50 now to 150 for this extra question)
0
 
Jaime OlivaresSoftware ArchitectCommented:
>>I see that 17 is not the decimal of 'A'.
I'm not sure on what you expect to have in this case.  Which is the decimal of A?
0
 
mrwad99Author Commented:
Sorry, ignore me.  I was forgetting we had subtracted 48.  (The int equivalent of A is 65, but we subtracted 48 from that to give 17.)

Looking at the asciitable I see that characters 0 - 9 are in the range 48 - 57 (inclusive), which is why we do the range test.

All is clear now :)

Thanks a lot :)
0
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.