![見出し画像](https://assets.st-note.com/production/uploads/images/61698321/rectangle_large_type_2_dc77d37bb29ad24490975012f78b24b5.png?width=1200)
Notes C API探訪: テキストを数値にコンバートする
前回に引き続き、今回はテキストを数値にコンバートするNotes C API関数をラップしてみます。
まずは、こちらの記事にあったソースコードから抜粋します。
// convertsimulatordialog.cppから抜粋
void ConvertSimulatorDialog::convertTextToNumber() {
nxpp::TextToNumberConverter converter;
setIntlFormat(&converter);
setNumberFormat(&converter);
try {
QString text = ui->textToNumberSrcLineEdit->text();
NUMBER num = converter(toLmbcsQ(text));
ui->textToNumberDestLineEdit->setText(QString::number(num));
}
// Notesステータスがスローされたらそのエラーメッセージに変換して表示
catch (nxpp::Status &status) {
consoleLog(nxpp::qt::fromStatus(status.error()));
}
// それ以外の例外ならそのメッセージを表示
catch (std::exception &ex) {
std::string what(ex.what());
consoleLog(QString::fromStdString(what));
}
}
この中には、nxpp::TextToNumberConverterというクラスが使われています。これは、テキストで書かれた数値を、フォーマットに則って数値型に変換する関数オブジェクトクラスです。
では、このクラスの定義を見てみます。
// nxpp/include/nxpp/nxpp_number.hpp
// ...
namespace nxpp {
// ...
class TextToNumberConverter
: public NumberConverter
{
public:
TextToNumberConverter() : NumberConverter() {}
TextToNumberConverter(
intl::SettingsPtr iPtr,
NumberFormatPtr nPtr
)
: NumberConverter(iPtr, nPtr)
{}
NUMBER operator () (const Lmbcs &lmbcs) const {
char *ptr = const_cast<char*>(lmbcs.c_str());
NUMBER num = 0;
Status status = ConvertTextToFLOAT(
!intlSettingsPtr_ ? nullptr : intlSettingsPtr_->data(),
!formatPtr_ ? nullptr : formatPtr_->data(),
&ptr,
static_cast<WORD>(lmbcs.length()),
&num
);
if (!status) { throw status; }
return num;
}
};
// ...
} // namespace nxpp
// ...
前回の記事同様、NumberConverterクラスから派生しているクラスで、違いは operator () オーバーロードの引数と戻り値の型が逆である点です。
中で使用している関数は ConvertTextToFLOATですが、フォーマット設定(INTLFORMATとNFMT)はConvertFLOATToTextと同じです。これらがヌルポインタであればデフォルトの設定が使われる点も同じです。
継承元クラスに遡る作業は、前回と全く同じになるので割愛します。
まとめ
今回ご紹介したコンバート関数のラップは、以下のような位置づけになります。
1. 数値 → テキスト (前回紹介済み)
2. テキスト → 数値 (今回紹介済み)
3. 日時 → テキスト
4. テキスト → 日時
次回は、3と4を紹介する上で避けて通れない、TIMEDATE型と他のデータとのやり取り(ここではQDateTime型)をご紹介します。