prices: improve precision
This commit is contained in:
		
							parent
							
								
									40699af34a
								
							
						
					
					
						commit
						8966e765c8
					
				| @ -13,7 +13,7 @@ import Data.Maybe | |||||||
| import Data.String.Here | import Data.String.Here | ||||||
| import Data.Time | import Data.Time | ||||||
| import qualified Data.Text as T | import qualified Data.Text as T | ||||||
| import Control.Monad | import Control.Monad (when) | ||||||
| import Hledger.Cli | import Hledger.Cli | ||||||
| 
 | 
 | ||||||
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ||||||
| @ -30,6 +30,13 @@ Print all prices from the journal. | |||||||
| showPrice :: MarketPrice -> String | showPrice :: MarketPrice -> String | ||||||
| showPrice mp = unwords ["P", show $ mpdate mp, T.unpack . quoteCommoditySymbolIfNeeded $ mpcommodity mp, showAmountWithZeroCommodity $ mpamount mp] | showPrice mp = unwords ["P", show $ mpdate mp, T.unpack . quoteCommoditySymbolIfNeeded $ mpcommodity mp, showAmountWithZeroCommodity $ mpamount mp] | ||||||
| 
 | 
 | ||||||
|  | divideAmount' :: Amount -> Quantity -> Amount | ||||||
|  | divideAmount' a d = a' where | ||||||
|  |     a' = (a `divideAmount` d) { astyle = style' } | ||||||
|  |     style' = (astyle a) { asprecision = precision' } | ||||||
|  |     extPrecision = (1+) . floor . logBase 10 $ (realToFrac d :: Double) | ||||||
|  |     precision' = extPrecision + asprecision (astyle a) | ||||||
|  | 
 | ||||||
| amountCost :: Day -> Amount -> Maybe MarketPrice | amountCost :: Day -> Amount -> Maybe MarketPrice | ||||||
| amountCost d a = | amountCost d a = | ||||||
|     case aprice a of |     case aprice a of | ||||||
| @ -37,7 +44,7 @@ amountCost d a = | |||||||
|         UnitPrice pa -> Just |         UnitPrice pa -> Just | ||||||
|             MarketPrice { mpdate = d, mpcommodity = acommodity a, mpamount = pa } |             MarketPrice { mpdate = d, mpcommodity = acommodity a, mpamount = pa } | ||||||
|         TotalPrice pa -> Just |         TotalPrice pa -> Just | ||||||
|             MarketPrice { mpdate = d, mpcommodity = acommodity a, mpamount = pa `divideAmount` abs (aquantity a) } |             MarketPrice { mpdate = d, mpcommodity = acommodity a, mpamount = pa `divideAmount'` abs (aquantity a) } | ||||||
| 
 | 
 | ||||||
| postingCosts :: Posting -> [MarketPrice] | postingCosts :: Posting -> [MarketPrice] | ||||||
| postingCosts p = mapMaybe (amountCost date) . amounts $ pamount p  where | postingCosts p = mapMaybe (amountCost date) . amounts $ pamount p  where | ||||||
|  | |||||||
| @ -34,8 +34,13 @@ P 2016/2/1 EUR $1.05 | |||||||
| 2016/1/2 spend | 2016/1/2 spend | ||||||
|     expenses             20 EUR @ $1.07 |     expenses             20 EUR @ $1.07 | ||||||
|     assets:bank |     assets:bank | ||||||
|  | 
 | ||||||
|  | 2016/1/3 spend | ||||||
|  |     expenses             20 EUR @@ $21.45 | ||||||
|  |     assets:bank | ||||||
| >>> | >>> | ||||||
| P 2016-01-02 EUR $1.07 | P 2016-01-02 EUR $1.07 | ||||||
|  | P 2016-01-03 EUR $1.0725 | ||||||
| P 2016-01-01 EUR $1.06 | P 2016-01-01 EUR $1.06 | ||||||
| P 2016-02-01 EUR $1.05 | P 2016-02-01 EUR $1.05 | ||||||
| >>>2 | >>>2 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user