文字列内の半角を全角に変換したい場合や、その逆のケースと言うのはちょくちょくあります。
私は下記のようなサブルーチンを作っています。
このサブルーチンでは、変換に失敗した場合に空文字列を返しています。
対象文字列を参照型で渡して、戻り値をbool型にするというのもいいのかな、と思います。
AnsiString __fastcall subExchangeString(AnsiString strDATA,int iTYPE) { // 文字列を半角<->全角間で変換を行う。 // iType : 1.全角->半角 2.半角->全角 AnsiString strDT; char *buf; int i; try { strDT = strDATA; // バッファメモリの確保 if (iTYPE == 1) i = CharLen(strDT.c_str()) + 2; // 全角 -> 半角 else i = CharLen(strDT.c_str()) * 2 + 2; // 半角 -> 全角 buf = (char*)malloc(i); if (!strDT.IsEmpty()) { // 変換処理の実行 switch (iTYPE) { case 1: // 全角->半角 ::LCMapString(GetUserDefaultLCID(),LCMAP_HALFWIDTH,strDT.c_str(), strDT.Length() + 1,buf,i); break; case 2: // 半角->全角 ::LCMapString(GetUserDefaultLCID(),LCMAP_FULLWIDTH,strDT.c_str(), strDT.Length() + 1,buf,i); break; default: // 無変換 strcpy(buf,strDATA.c_str()); } // 変換結果文字列を変数に格納 strDT = AnsiString(buf); switch (iTYPE) { case 1: // 変換結果に全角が含まれているかチェックする for (i = 1;i < strDT.Length();i++) { if (strDT.IsLeadByte(i)) { // 全角文字が含まれる strDT = ""; break; } } break; case 2: // 変換結果に半角が含まれているかチェックする for (i = 1;i < strDT.Length();i++) { if (strDT.ByteType(i) == mbSingleByte) { // 半角文字が含まれる strDT = ""; break; } } break; } } // バッファの解放 free(buf); } catch(...) { strDT = ""; } // 変換結果を戻す return(strDT); }