将双字节字符转换为整数C ++

时间:2013-04-08 08:00:57

标签: c++ mfc cjk

我正在用C ++构建一个MFC项目。我有一个文本字段,用户需要输入一个数字。我可以在使用英文键盘时将其转换为整数。但是当用户切换到日语键盘时,它不起作用。

我知道日语键盘会创建双字节字符。但我不知道如何将它们转换为整数。

Sory缺乏信息。

我的目的是检查文本字段中的输入用户类型是否为数字。 但它无法识别日文键盘的数字。 我尝试了一些方法,例如:strtol(),_ wtoi。 但结果(频率)始终为0; 我在debuging时获得的字符串是123456789而不是123456789。 这是我的代码

CString strFrequency;
GetDlgItem(IDC_EDIT_FREQUENCY)->GetWindowText(strFrequency);
if(strFrequency.IsEmpty()){
    CDialog::OnOK();
    return;
}       

for(int i=1; i<strFrequency.GetLength(); i+=2) {        
    if(!std::isdigit(strFrequency[i])){
        MessageBox("数字で入力してください。","発表支援");
        return;

    }
}   
int frequency = atoi(strFrequency);

每个人都可以帮助我吗?

提前致谢

3 个答案:

答案 0 :(得分:1)

CString strFrequency;
GetDlgItem(IDC_EDIT_FREQUENCY)->GetWindowText(strFrequency);

DWORD flags = LCMAP_HALFWIDTH; 
const int size = strFrequency.GetLength() / 2 + 1;
char* s = new char[size];
ZeroMemory(s, size);
LCMapString(LOCALE_SYSTEM_DEFAULT,
        flags,
        strFrequency,
        strFrequency.GetLength() + 1,
        s,
        size);
CString convertedText = s;

我解决了。日语键盘输入的字符串( strFrequency )是全宽长度。所以我将全角字符串转换为半角字符串。然后我可以检查它是否是数字字符串。

答案 1 :(得分:0)

如果没有看到试图转换数字的代码,并且至少没有对将日文文本放入其中的实际情况进行简单描述,那么很难说出什么/为什么是错误的。现在,我唯一能想到的是你要么使用错误的数据类型(即CHAR而不是WCHAR),要么就是你试图直接解析像'四万'这样的日语符号和一些像阿拉伯一样的解析器,如atoi() ,或者您可能忘记正确设置流编码或语言环境。

请记住,虽然日语键盘和日语语言环境将能够生成'40000'的文本,可能会用istringstream解析(甚至可能会被某些atoi版本解析),那么几乎可以肯定日语数字就像'四万'(也就是40000)很可能不会被解析。我认为“四万”的文字不是数字 - 但我可能在这里错了!我从来没有尝试过。但是,在搜索了一下后,我没有看到任何提及这是可能的。

但是,似乎有一些解析汉字数字的方法,例如参见How to parse kanji numeric characters using ICU?

答案 2 :(得分:0)

如果此调用编译并确实显示日文字符,

MessageBox("数字で入力してください。","発表支援");

然后,您似乎将项目构建为ANSI,而不是UNICODE。

尝试将项目构建为UNICODE,将调用更改为

MessageBox(L"数字で入力してください。",L"発表支援");