Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# TCHAR to int

Posted on 2007-11-19
Medium Priority
4,148 Views
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
0
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 4
• 2

LVL 11

Expert Comment

ID: 20312518
ttoi() -  did you try this?

Best regards,
DeepuAbrahamK
0

LVL 55

Expert Comment

ID: 20312523
just do a casting operation:

TCHAR a = somestring.GetAt(5);
int i = (int)a;
0

LVL 11

Expert Comment

ID: 20312538

int i = _ttoi((LPCTSTR)tchardata);

Try this way of casting as well
0

LVL 19

Author Comment

ID: 20312563
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

LVL 55

Accepted Solution

Jaime Olivares earned 600 total points
ID: 20312573
not sure what you need
if you want to convert just 1 character to int, then:
int i = (int)a - 48;
0

LVL 19

Author Comment

ID: 20312590
>> 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

LVL 55

Expert Comment

ID: 20312654
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

LVL 19

Author Comment

ID: 20312983
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

LVL 55

Expert Comment

ID: 20313086
>>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

LVL 19

Author Comment

ID: 20313113
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

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Database storage, where is the exe actually on the disc? Playing a game selected randomly (how to generate random numbers).  Error trapping with try..catch to help the code run even if something goes wrong. Continuing from the seveâ€¦
Introduction: Dialogs (2) modeless dialog and a worker thread.  Handling data shared between threads.  Recursive functions. Continuing from the tenth article about sudoku.   Last article we worked with a modal dialog to help maintain informatâ€¦
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relatâ€¦
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
###### Suggested Courses
Course of the Month8 days, 19 hours left to enroll