「Qtの基礎 - 文字列」の版間の差分
編集の要約なし |
|||
228行目: | 228行目: | ||
<br> | <br> | ||
また、<code>qPrintable(const QString &str)</code>マクロも存在しており、これは、<code><QString型のオブジェクト>.toLocal8Bit().constData()</code>に展開される。<br> | また、<code>qPrintable(const QString &str)</code>マクロも存在しており、これは、<code><QString型のオブジェクト>.toLocal8Bit().constData()</code>に展開される。<br> | ||
<br><br> | |||
== QString型からQByteArray型へ変換 == | |||
<syntaxhighlight lang="c++"> | |||
QString strData = "文字列"; | |||
QByteArray byaryData = strData.toUtf8(); | |||
// または | |||
#include <QTextCodec> | |||
QString strData = "文字列"; | |||
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); | |||
QByteArray byaryData = codec->fromUnicode(strData); | |||
</syntaxhighlight> | |||
<br><br> | |||
== QByteArray型からQString型へ変換 == | |||
<syntaxhighlight lang="c++"> | |||
QByteArray byaryData = file.readAll(); | |||
QString strData = QString::fromUtf8(byaryData); | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] |
2023年3月7日 (火) 18:11時点における版
概要
数値を文字列に変換する
QString::number()
を使用して、数値を文字列に変換する。
少数を変換する場合、第2引数にe
またはE
を指定すると指数表記、f
を指定すると少数表記になる。
この時、第3引数の数値は、小数点以下の桁数となる。
第2引数にg
またはG
を指定すると、指数表記と少数表記のうち、より簡潔に表現できる方で変換される。
この時、第3引数の数値は、有効桁数となる。
第2引数の詳細は、Qtの公式Webサイトを参照すること。
int i = 10;
qDebug() << QString::number(i); // 10進数として文字列化
qDebug() << QString::number(i, 8); // 8進数として文字列化
qDebug() << QString::number(i, 16); // 16進数として文字列化(アルファベット小文字)
qDebug() << QString::number(i, 16).toUpper(); // 16進数として文字列化(アルファベット大文字)
double d = 12.3456789;
qDebug() << QString::number(d, 'e', 1); // 浮動小数12.3456789を小数点以下1桁で指数表記
qDebug() << QString::number(d, 'e', 7); // 浮動小数12.3456789を小数点以下7桁で指数表記
qDebug() << QString::number(d, 'f', 1); // 浮動小数12.3456789を小数点以下1桁で小数表記
qDebug() << QString::number(d, 'f', 7); // 浮動小数12.3456789を小数点以下7桁で小数表記
qDebug() << QString::number(0.0000001, 'g', 7); // 浮動小数0.0000001を有効桁数7桁で簡潔表記
qDebug() << QString::number(1.2345678, 'g', 7); // 浮動小数1.2345678を有効桁数7桁で簡潔表記
qDebug() << QString((int)'A' + 2); // 16進数 0x0Cが文字Cに変換される
文字列を数値に変換する
QString numStr = "1234";
int i = numStr.toInt(); // i=1234
long l = numStr.toLong(); // l=1234
double d = numStr.toDouble(); // d=1234
文字列の長さや数を取得する
QString txtStr = "ABC123:def12 6";
int sz = txtStr.length(); // 空白を含む文字数 sz=14
int ix = txtStr.indexOf("12"); // 指定文字列を最初に見つけた位置 ix=3
int cnt = txtStr.count("12"); // 指定文字列の個数 cnt=2
QString str = txtStr.at(1); // 指定位置の文字 str="B"
※注意
lengthは0x00も1文字として数える。
文字列の確認
QString txtStr = "ABC123:def126 ";
bool bl = txtStr.contains("F12"); // 指定文字を含むか bl=false
bool bl = txtStr.contains("F12", Qt::CaseInsensitive); // 指定文字を含むか bl=true
bool bl = txtStr.startsWith("A"); // 指定文字から始まるか bl=true
bool bl = txtStr.endsWith("6"); // 指定文字で終わるか bl=false(最後は空白)
// isNullメソッドとisEmptyメソッドは異なる
QString txtStr2 = "";
bool bl = txtStr.isEmpty(); // 空か bl=true
bool bl = txtStr.isNull(); // NULLか bl=false
※注意
CaseInsensitive
を指定する場合、大文字・小文字の区別を無視する。
startsWith
メソッドとendsWith
メソッドも、CaseInsensitive
を指定することができる。
基本的な文字列操作
QString txtStr = "ABC123:def126 ";
QString str = txtStr.mid(1, 3); // 指定位置から指定文字数を切り出す str="BC1"
QString str = txtStr.left(1); // 先頭から指定文字数を切り出す str="A"
QString str = txtStr.right(2); // 末尾から指定文字数を切り出す str="6 "
QString str = txtStr.toLower(); // アルファベット小文字に変換する str="abc123:def126 "
QString str = txtStr.toUpper(); // アルファベット大文字に変換する str="ABC123:DEF126 "
QString str = txtStr.repeated(2); // 指定回数だけ繰り返す str="ABC123:def126 ABC123:def126 "
以下の例では、元の文字列を書き換えるため、使用する場合は注意が必要である。
QString txtStr = "ABC123:def126 ";
txtStr.replace(3, 2, "xy"); // 指定位置から指定文字数の置き換える txtStr="ABCxy3:def126 "
txtStr.chop(2); // 末尾の指定文字数を削除する txtStr="ABCxy3:def12"
txtStr.insert(1, QString("and")); // 指定位置の前に挿入する txtStr="AandBCxy3:def12"
txtStr.fill('X', 4); // 文字を指定数並べる txtStr="XXXX"
txtStr.setNum(2.5); // 数値を文字列に変換する txtStr="2.5"
文字列の右詰め
QString txtStr = "12345";
QString str = txtStr.rightJustified(8, '0'); // str="00012345"
QString str = txtStr.rightJustified(8, '.'); // str="...12345"
QString str = txtStr.rightJustified(3, '.', true); // str="123"
QString str = txtStr.rightJustified(3, '.', false); // str="12345"
QString str = QString::number(98).rightJustified(4, '0'); // str="0098"
※注意
rightJustified
メソッドの第3引数の初期値は、false
である。true
を指定すると指定桁数に切り詰める。
空白の切り詰め
simplified
メソッドは、空白・タブ・改行をまとめて1つの空白に置き換える。この時、先頭と末尾は削られる。
trimmed
メソッドは、先頭と末尾の空白・タブ・改行を取り除く。
QString txtStr = "\t AB CD\n EF GH\tIJ\n\nKL \n";
QString str = txtStr.simplified(); str="AB CD EF GH IJ KL"
QString str = txtStr.trimmed(); str="AB CD\n EF GH\tIJ\n\nKL"
パディング
以下の例では、1~1000までの整数を0001、0002、0003、...、1000という文字列にパディングしている。
第3引数(初期値 : false)の違いは、第1引数で指定した桁数を超える場合、後ろを切る捨てるか否かの設定である。
for(int i = 1; i <= 1000; i++)
{
qDebug() << QString::number(i).rightJustified(4, '0');
}
for(int i = 1; i <= 1000; i++)
{
qDebug() << QString::number(i).rightJustified(4, '0', true);
}
また、rightJustified
メソッドは、文字列の先頭を空白で埋めるなどもできる。
QStringList list = {"a", "aa", "aaa", "aaaa", "aaaaa"};
for(QString str : list)
{
qDebug() << str.rightJustified(5, ' ');
}
文字列の分割
以下の例では、文字列を区切り文字で分割して、文字列リスト(QStringList)に代入している。
QString txtStr = "ABC123:def12 ";
QStringList list = txtStr.split(":"); // :(コロン)で分割する
QString str = list[0]; // "ABC123"
QString str = list[1]; // "def12 "
以下の例では、ループで文字列リストを処理している。上記と同様の結果になる。
QString txtStr = "ABC123:def12 ";
QStringList list = txtStr.split(":"); // :(コロン)で分割する
for(int i = 0; i < list.count(); i++)
{
QString str = list.at(i); // list[i]でも同じ
}
foreach(QString word, list)
{
QString str = word;
}
文字列の整形
arg
と%
を使用して、文字列を整形できる。
QString str = QString("座標=(%1, %2) サイズ=%3x%4 テキスト=%5").arg(10).arg(20).arg(240).arg(120).arg("メッセージ");
// str="座標=(10, 20) サイズ=240x120 テキスト=メッセージ"
また、printf
のように文字列を整形することもできる。
QString sDt="ABC";
QString str;
// Qt 5.7以前
str.sprintf("%02d:%02d, %cクラス, 0x%04x, (%4.2lf), (%-3d), (%5s), (%.2s)", 9, 2, 'S', 255, 3.1415, 7, qPrintable(sDt), qPrintable(sDt));
// str="09:02, Sクラス, 0x00ff, (3.14), (7 ), ( ABC), (AB)"
// Qt 5.7以降
QString str = QString::asprintf("%02d:%02d, %cクラス, 0x%04x, (%4.2lf), (%-3d), (%5s), (%.2s)", 9, 2, 'S', 255, 3.1415, 7, qPrintable(sDt), qPrintable(sDt));
// str="09:02, Sクラス, 0x00ff, (3.14), (7 ), ( ABC), (AB)"
※注意
半角英数の場合はqPrintable
関数でも表示できるが、全角文字の場合はQString
クラスのtoUtf8().constData()
を使用しないと文字化けする。
また、Qt 5.7以降では、以下のように、QString::asprintf
メソッドが使用できる。
QString str = QString::asprintf("フォーマット", データの並び);
QString型からchar型またはstd::string型へ変換
QString
型はUTF-16でエンコードされているのに対して、char
型またはstd::string
型はどの種類のエンコーディングでもよいことに注意する。
以下の例では、QString
型(UTF-16)からchar
型(UTF-8)またはstd::string
型(UTF-8)へ変換している。
QString strUTF16 = "Sample";
// LinuxまたはMacOSにおいて、UTF-8を使用している場合
std::string strUTF8 = strUTF16.toUtf8().constData();
// Windowsにおいて、UTF-8を使用している場合
std::string strCurrentLocale = strUTF16.toLocal8Bit().constData();
また、qPrintable(const QString &str)
マクロも存在しており、これは、<QString型のオブジェクト>.toLocal8Bit().constData()
に展開される。
QString型からQByteArray型へ変換
QString strData = "文字列";
QByteArray byaryData = strData.toUtf8();
// または
#include <QTextCodec>
QString strData = "文字列";
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QByteArray byaryData = codec->fromUnicode(strData);
QByteArray型からQString型へ変換
QByteArray byaryData = file.readAll();
QString strData = QString::fromUtf8(byaryData);