1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2015 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:
23 for (int i
= str
.size()-1; (str
[i
] == '0' && isdigit(str
[i
-2])); --i
)
26 str
.erase(str
.size()-nTrim
, nTrim
);
29 str
.insert((unsigned int)0, 1, '-');
34 bool ParseMoney(const std::string
& str
, CAmount
& nRet
)
36 return ParseMoney(str
.c_str(), nRet
);
39 bool ParseMoney(const char* pszIn
, CAmount
& nRet
)
43 const char* p
= pszIn
;
51 int64_t nMult
= CENT
*10;
52 while (isdigit(*p
) && (nMult
> 0))
54 nUnits
+= nMult
* (*p
++ - '0');
63 strWhole
.insert(strWhole
.end(), *p
);
68 if (strWhole
.size() > 10) // guard against 63 bit overflow
70 if (nUnits
< 0 || nUnits
> COIN
)
72 int64_t nWhole
= atoi64(strWhole
);
73 CAmount nValue
= nWhole
*COIN
+ nUnits
;