Merge #12075: [scripts] Add missing univalue file to copyright_header.py
[bitcoinplatinum.git] / src / utilmoneystr.cpp
blobea8a817ac47c8a5b01bdfe61163897881d9358f8
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2017 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 #include <utilmoneystr.h>
8 #include <primitives/transaction.h>
9 #include <tinyformat.h>
10 #include <utilstrencodings.h>
12 std::string FormatMoney(const CAmount& n)
14 // Note: not using straight sprintf here because we do NOT want
15 // localized number formatting.
16 int64_t n_abs = (n > 0 ? n : -n);
17 int64_t quotient = n_abs/COIN;
18 int64_t remainder = n_abs%COIN;
19 std::string str = strprintf("%d.%08d", quotient, remainder);
21 // Right-trim excess zeros before the decimal point:
22 int nTrim = 0;
23 for (int i = str.size()-1; (str[i] == '0' && isdigit(str[i-2])); --i)
24 ++nTrim;
25 if (nTrim)
26 str.erase(str.size()-nTrim, nTrim);
28 if (n < 0)
29 str.insert((unsigned int)0, 1, '-');
30 return str;
34 bool ParseMoney(const std::string& str, CAmount& nRet)
36 return ParseMoney(str.c_str(), nRet);
39 bool ParseMoney(const char* pszIn, CAmount& nRet)
41 std::string strWhole;
42 int64_t nUnits = 0;
43 const char* p = pszIn;
44 while (isspace(*p))
45 p++;
46 for (; *p; p++)
48 if (*p == '.')
50 p++;
51 int64_t nMult = CENT*10;
52 while (isdigit(*p) && (nMult > 0))
54 nUnits += nMult * (*p++ - '0');
55 nMult /= 10;
57 break;
59 if (isspace(*p))
60 break;
61 if (!isdigit(*p))
62 return false;
63 strWhole.insert(strWhole.end(), *p);
65 for (; *p; p++)
66 if (!isspace(*p))
67 return false;
68 if (strWhole.size() > 10) // guard against 63 bit overflow
69 return false;
70 if (nUnits < 0 || nUnits > COIN)
71 return false;
72 int64_t nWhole = atoi64(strWhole);
73 CAmount nValue = nWhole*COIN + nUnits;
75 nRet = nValue;
76 return true;