MFC
数値と文字列を相互変換する


HomeProgramming TipsMFC Tips[MFC-021]

知ってれば簡単なのに難しく考えてしまうと出来ないことの一つに、この数値と文字列の相互変換があります。
いや、知っていても良く忘れたりするんですが( ̄ー ̄;
XML やら ini ファイルやら、情報をテキストベースではき出す場合に本情報は必須でしょう。

と、いうわけで自分のメモも兼ねて情報を記載しておきます。


■ 数値を文字列にする

こちらの考え方は簡単ですね。SDK レベルなら sprintf とかを使用すれば同じ事が出来るはずです。
wsprintf だと、%f が使えないので注意しましょう。


    int num;

    // 10進数
    CString strNum;
    strNum.Format(_T("%d"), num);

    // 16進数
    CString strHex;
    strHex.Format(_T("%X"), num);

    // 桁数指定付き16進数(下記は8桁固定)
    CString strHexDigit;
    strHexDigit.Format(_T("%08X"), num);



■ 文字列を数値化する

こちらで悩む人がどうも多いようです。
まあ、MFC は sscanf なんてラップしてませんからねぇ(苦笑)。

ちょっと考えれば分かるのですが、文字を文字列に変えるのが printf を拡張した sprintf ならば、
その逆の動作は、printf と逆の動作をする関数を使えばよいのです。
そう、scanf にも、文字列から入力を行う sscanf があるのです。
ただ、sscanf だと MBCS しか対応できませんので、同じ記述するのなら _stscanf を使いましょう。



    BOOL bSuccess;
    CString strNum;

    // 10進数
    int num;
    bSuccess = _stscanf(strNum, "%d", &num) != EOF ? TRUE : FALSE;

    // 16進数
    DWORD dwNum;
    bSuccess = _stscanf(strNum, "%x", &dwNum) != EOF ? TRUE : FALSE;

文字列が数値化できなかったことを確認する必要がありますので、_stscanf の戻り値は必ずチェックしてください。



 Copyright 2008 VALGUS. All Rights Reserved.