]>
Commit | Line | Data |
---|---|---|
4d04492b | 1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
f914f1a7 | 2 | // Copyright (c) 2009-2014 The Bitcoin Core developers |
c63a73d1 | 3 | // Distributed under the MIT software license, see the accompanying |
4d04492b PK |
4 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
5 | ||
ad49c256 WL |
6 | #include "utilmoneystr.h" |
7 | ||
d2270111 | 8 | #include "primitives/transaction.h" |
ad49c256 | 9 | #include "tinyformat.h" |
85c579e3 | 10 | #include "utilstrencodings.h" |
ad49c256 WL |
11 | |
12 | using namespace std; | |
13 | ||
a5beb3a5 | 14 | std::string FormatMoney(const CAmount& n) |
ad49c256 WL |
15 | { |
16 | // Note: not using straight sprintf here because we do NOT want | |
17 | // localized number formatting. | |
18 | int64_t n_abs = (n > 0 ? n : -n); | |
19 | int64_t quotient = n_abs/COIN; | |
20 | int64_t remainder = n_abs%COIN; | |
21 | string str = strprintf("%d.%08d", quotient, remainder); | |
22 | ||
23 | // Right-trim excess zeros before the decimal point: | |
24 | int nTrim = 0; | |
25 | for (int i = str.size()-1; (str[i] == '0' && isdigit(str[i-2])); --i) | |
26 | ++nTrim; | |
27 | if (nTrim) | |
28 | str.erase(str.size()-nTrim, nTrim); | |
29 | ||
30 | if (n < 0) | |
31 | str.insert((unsigned int)0, 1, '-'); | |
ad49c256 WL |
32 | return str; |
33 | } | |
34 | ||
35 | ||
a372168e | 36 | bool ParseMoney(const string& str, CAmount& nRet) |
ad49c256 WL |
37 | { |
38 | return ParseMoney(str.c_str(), nRet); | |
39 | } | |
40 | ||
a372168e | 41 | bool ParseMoney(const char* pszIn, CAmount& nRet) |
ad49c256 WL |
42 | { |
43 | string strWhole; | |
44 | int64_t nUnits = 0; | |
45 | const char* p = pszIn; | |
46 | while (isspace(*p)) | |
47 | p++; | |
48 | for (; *p; p++) | |
49 | { | |
50 | if (*p == '.') | |
51 | { | |
52 | p++; | |
53 | int64_t nMult = CENT*10; | |
54 | while (isdigit(*p) && (nMult > 0)) | |
55 | { | |
56 | nUnits += nMult * (*p++ - '0'); | |
57 | nMult /= 10; | |
58 | } | |
59 | break; | |
60 | } | |
61 | if (isspace(*p)) | |
62 | break; | |
63 | if (!isdigit(*p)) | |
64 | return false; | |
65 | strWhole.insert(strWhole.end(), *p); | |
66 | } | |
67 | for (; *p; p++) | |
68 | if (!isspace(*p)) | |
69 | return false; | |
70 | if (strWhole.size() > 10) // guard against 63 bit overflow | |
71 | return false; | |
72 | if (nUnits < 0 || nUnits > COIN) | |
73 | return false; | |
74 | int64_t nWhole = atoi64(strWhole); | |
a372168e | 75 | CAmount nValue = nWhole*COIN + nUnits; |
ad49c256 WL |
76 | |
77 | nRet = nValue; | |
78 | return true; | |
79 | } |