Как я могу получить массив всех символов валюты и сокращений валюты в C ++ или Qt? - PullRequest
1 голос
/ 28 марта 2020

Мне нужно получить все возможные символы валют и сокращения валют в моей программе в виде массива. Как я могу добиться этого с C ++ или, возможно, с Qt?

1 Ответ

1 голос
/ 28 марта 2020

Анализ существующего актуального списка валют

Я нашел коды валют JSON список https://gist.github.com/Fluidbyte/2973986.
Этот список регулярно обновляется.

Как можно проанализировать список. Загрузите необработанный JSON текст по ссылке. Сохраните его в текстовом файле в кодировке UTF-8. Разберите его как-нибудь по поводу написанного ниже.

#include <QtWidgets/QApplication>    
#include <QVariantMap>
#include <QStringList>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QDebug>
#include <QPlainTextEdit>

using CurrencyMap = QMap<QString, QVariantMap>; // Use three-letter code as a key
using CurrencyMapIterator = QMapIterator<QString, QVariantMap>;

CurrencyMap parseCurrencyDataFromJson(QByteArray utf8Json)
{
    CurrencyMap ret;

    QJsonParseError parseError;
    QJsonDocument document = QJsonDocument::fromJson(utf8Json, &parseError);

    if (parseError.error != QJsonParseError::NoError)
    {
        qWarning() << parseError.errorString();
    }

    if (!document.isNull())
    {
        QJsonObject jobject = document.object();

        // Iterate over all the currencies
        for (QJsonValue val : jobject)
        {
            // Object of a given currency
            QJsonObject obj = val.toObject();

            // Three-letter code of the currency
            QString name = obj.value("code").toString();

            // All the data available for the given currency
            QVariantMap fields = obj.toVariantMap();

            ret.insert(name, fields);
        }
    }

    return ret;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPlainTextEdit plainTextEdit;
    plainTextEdit.show();

    // File saved from the GitHub repo
    QFile file("curr.json");
    if (file.open(QIODevice::ReadOnly))
    {
        QByteArray jsonData = file.readAll();

        CurrencyMap currencyMap = parseCurrencyDataFromJson(jsonData);

        // Output all the available currency symbols to the plainTextEdit
        CurrencyMapIterator currency(currencyMap);

        while (currency.hasNext())
        {
            currency.next();

            QString code = currency.key();
            QVariantMap fileds = currency.value();

            QStringList currencyInfo
            {
                code,
                fileds.value("symbol").toString(),
                fileds.value("symbol_native").toString()
            };

            plainTextEdit.appendPlainText(currencyInfo.join('\t'));
        }

        QString total = QString("\nTotal Available Currencies Count = %1")
            .arg(currencyMap.count());

        plainTextEdit.appendPlainText(total);
    }

    return a.exec();
}

QChar-Limited Solution

QChar и решение на основе Unicode. Но учтите, что QChar сам поддерживает коды максимум до 0xFFFF. Следовательно, таким образом можно получить только ограниченное количество символов.

// In Qt, Unicode characters are 16-bit entities.
// QChar itself supports only codes with 0xFFFF maximum
QList<QChar> getAllUnicodeSymbolsForCategory(QChar::Category cat)
{
    QList<QChar> ret;

    // QChar actually stores 16-bit values
    const static quint16 QCharMaximum = 0xFFFF;

    for (quint16 val = 0; val < QCharMaximum; val++)
    {
        QChar ch(val);

        if (ch.category() == cat)
        {
            ret.append(ch);
        }
    }

    return ret; 
}

Использование

QList<QChar> currencies = getAllUnicodeSymbolsForCategory(QChar::Symbol_Currency);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...