1 #include "bitcoinunits.h"
6 BitcoinUnits::BitcoinUnits(QObject *parent):
7 QAbstractListModel(parent),
8 unitlist(availableUnits())
12 QList<BitcoinUnits::Unit> BitcoinUnits::availableUnits()
14 QList<BitcoinUnits::Unit> unitlist;
16 unitlist.append(mBTC);
17 unitlist.append(uBTC);
21 bool BitcoinUnits::valid(int unit)
34 QString BitcoinUnits::name(int unit)
38 case BTC: return QString("BTC");
39 case mBTC: return QString("mBTC");
40 case uBTC: return QString::fromUtf8("μBTC");
41 default: return QString("???");
45 QString BitcoinUnits::description(int unit)
49 case BTC: return QString("Bitcoins");
50 case mBTC: return QString("Milli-Bitcoins (1 / 1,000)");
51 case uBTC: return QString("Micro-Bitcoins (1 / 1,000,000)");
52 default: return QString("???");
56 qint64 BitcoinUnits::factor(int unit)
60 case BTC: return 100000000;
61 case mBTC: return 100000;
62 case uBTC: return 100;
63 default: return 100000000;
67 int BitcoinUnits::amountDigits(int unit)
71 case BTC: return 8; // 21,000,000 (# digits, without commas)
72 case mBTC: return 11; // 21,000,000,000
73 case uBTC: return 14; // 21,000,000,000,000
78 int BitcoinUnits::decimals(int unit)
89 QString BitcoinUnits::format(int unit, qint64 n, bool fPlus)
91 // Note: not using straight sprintf here because we do NOT want
92 // localized number formatting.
94 return QString(); // Refuse to format invalid unit
95 qint64 coin = factor(unit);
96 int num_decimals = decimals(unit);
97 qint64 n_abs = (n > 0 ? n : -n);
98 qint64 quotient = n_abs / coin;
99 qint64 remainder = n_abs % coin;
100 QString quotient_str = QString::number(quotient);
101 QString remainder_str = QString::number(remainder).rightJustified(num_decimals, '0');
103 // Right-trim excess 0's after the decimal point
105 for (int i = remainder_str.size()-1; i>=2 && (remainder_str.at(i) == '0'); --i)
107 remainder_str.chop(nTrim);
110 quotient_str.insert(0, '-');
111 else if (fPlus && n > 0)
112 quotient_str.insert(0, '+');
113 return quotient_str + QString(".") + remainder_str;
116 QString BitcoinUnits::formatWithUnit(int unit, qint64 amount, bool plussign)
118 return format(unit, amount, plussign) + QString(" ") + name(unit);
121 bool BitcoinUnits::parse(int unit, const QString &value, qint64 *val_out)
123 if(!valid(unit) || value.isEmpty())
124 return false; // Refuse to parse invalid unit or empty string
125 int num_decimals = decimals(unit);
126 QStringList parts = value.split(".");
130 return false; // More than one dot
132 QString whole = parts[0];
139 if(decimals.size() > num_decimals)
141 return false; // Exceeds max precision
144 QString str = whole + decimals.leftJustified(num_decimals, '0');
148 return false; // Longer numbers will exceed 63 bits
150 qint64 retvalue = str.toLongLong(&ok);
158 int BitcoinUnits::rowCount(const QModelIndex &parent) const
161 return unitlist.size();
164 QVariant BitcoinUnits::data(const QModelIndex &index, int role) const
166 int row = index.row();
167 if(row >= 0 && row < unitlist.size())
169 Unit unit = unitlist.at(row);
173 case Qt::DisplayRole:
174 return QVariant(name(unit));
175 case Qt::ToolTipRole:
176 return QVariant(description(unit));
178 return QVariant(static_cast<int>(unit));