1 #include "bitcoinunits.h"
5 BitcoinUnits::BitcoinUnits(QObject *parent):
6 QAbstractListModel(parent),
7 unitlist(availableUnits())
11 QList<BitcoinUnits::Unit> BitcoinUnits::availableUnits()
13 QList<BitcoinUnits::Unit> unitlist;
15 unitlist.append(mBTC);
16 unitlist.append(uBTC);
20 bool BitcoinUnits::valid(int unit)
33 QString BitcoinUnits::name(int unit)
37 case BTC: return QString("NVC");
38 case mBTC: return QString("mNVC");
39 case uBTC: return QString::fromUtf8("μNVC");
40 default: return QString("???");
44 QString BitcoinUnits::description(int unit)
48 case BTC: return QString(QObject::tr("NovaCoins"));
49 case mBTC: return QString(QObject::tr("Milli-NovaCoins (1 / 1,000)"));
50 case uBTC: return QString(QObject::tr("Micro-NovaCoins (1 / 1,000,000)"));
51 default: return QString("???");
55 qint64 BitcoinUnits::factor(int unit)
59 case BTC: return 1000000;
60 case mBTC: return 1000;
62 default: return 1000000;
66 int BitcoinUnits::amountDigits(int unit)
70 case BTC: return 8; // 21,000,000 (# digits, without commas)
71 case mBTC: return 11; // 21,000,000,000
72 case uBTC: return 14; // 21,000,000,000,000
77 int BitcoinUnits::decimals(int unit)
88 QString BitcoinUnits::format(int unit, qint64 n, bool fPlus)
90 // Note: not using straight sprintf here because we do NOT want
91 // localized number formatting.
93 return QString(); // Refuse to format invalid unit
94 qint64 coin = factor(unit);
95 int num_decimals = decimals(unit);
96 qint64 n_abs = (n > 0 ? n : -n);
97 qint64 quotient = n_abs / coin;
98 qint64 remainder = n_abs % coin;
99 QString quotient_str = QString::number(quotient);
100 QString remainder_str = QString::number(remainder).rightJustified(num_decimals, '0');
102 // Right-trim excess zeros after the decimal point
104 for (int i = remainder_str.size()-1; i>=2 && (remainder_str.at(i) == '0'); --i)
106 remainder_str.chop(nTrim);
109 quotient_str.insert(0, '-');
110 else if (fPlus && n > 0)
111 quotient_str.insert(0, '+');
112 return quotient_str + QString(".") + remainder_str;
115 QString BitcoinUnits::formatWithUnit(int unit, qint64 amount, bool plussign)
117 return format(unit, amount, plussign) + QString(" ") + name(unit);
120 bool BitcoinUnits::parse(int unit, const QString &value, qint64 *val_out)
122 if(!valid(unit) || value.isEmpty())
123 return false; // Refuse to parse invalid unit or empty string
124 int num_decimals = decimals(unit);
125 QStringList parts = value.split(".");
129 return false; // More than one dot
131 QString whole = parts[0];
138 if(decimals.size() > num_decimals)
140 return false; // Exceeds max precision
143 QString str = whole + decimals.leftJustified(num_decimals, '0');
147 return false; // Longer numbers will exceed 63 bits
149 qint64 retvalue = str.toLongLong(&ok);
157 int BitcoinUnits::rowCount(const QModelIndex &parent) const
160 return unitlist.size();
163 QVariant BitcoinUnits::data(const QModelIndex &index, int role) const
165 int row = index.row();
166 if(row >= 0 && row < unitlist.size())
168 Unit unit = unitlist.at(row);
172 case Qt::DisplayRole:
173 return QVariant(name(unit));
174 case Qt::ToolTipRole:
175 return QVariant(description(unit));
177 return QVariant(static_cast<int>(unit));