# Price Module¶

The price module defines value objects to deal with prices and charges. The following types exist: * Price: Represents simply a money value. See below for more details. For example: 5€ * Charge: Represents a Price together with its Type. This is used to describe that something need to be paid in a certain currency and represents a certain value. For example it might be you need (or want) to pay the value of 5€ in 500 Loyaltypoints. This can be described in the Charge Type. * Charges: Is a list of the type Charge. For example to indicate that you are paying to value of 5€ with two Charges: 2€ and 300 Loyaltypoints

## Price Type:¶

The price module offers a Price Type with useful methods.

Price calculation is not a trivial topic and multiple solutions exist. The implementation details of the price object is:

- internally we use big.Float to hold the amount, this is to be able to calculate exactly
- however, a float like representation of an amount cannot be paid, that is why the price has a method "GetPayablePrice" that returns a Price that can be paid in the given currency, using correct rounding and amount representation

### Example:¶

```
// get 2.45 EUR Price
price := NewFromInt(245,100,"EUR")
rowPrice := price.Multiply(10)
// 10% discount
discountedRowPrice := rowPrice.Discounted(10.0)
// What needs to be paid:
priceToPay := discountedRowPrice.GetPayable()
// what needs to be paid by item()
singleItemsPrices := discountedRowPrice.SplitInPayables(10)
// you can also set price from float:
price2 := NewFromFloat(2.45,"EUR")
```

Be aware that `price.Equals(price2)`

may be false but due to float arithmetic but
`price.GetPayable().Equals(price2.GetPayable())`

will be true

#### Rounding Modes¶

We support a variety of rounding modes. These can be used with the `GetPayableByRoundingMode`

function by specifying a mode and precision. The following modes are available:

`RoundingModeFloor`

Rounding mode to round towards negative infinity.
*Note that this rounding mode never increases the calculated value.*

`price` |
`price.GetPayableByRoundingMode(RoundingModeFloor, 1)` |
---|---|

5.5 | 5 |

2.5 | 2 |

1.6 | 1 |

1.1 | 1 |

1.0 | 1 |

-1.0 | -1 |

-1.1 | -2 |

-1.6 | -2 |

-2.5 | -3 |

-5.5 | -6 |

* `RoundingModeCeil` |

Rounding mode to round towards positive infinity.
*Note that this rounding mode never decreases the calculated value.*

`price` |
`price.GetPayableByRoundingMode(RoundingModeCeil, 1)` |
---|---|

5.5 | 6 |

2.5 | 3 |

1.6 | 2 |

1.1 | 2 |

1.0 | 1 |

-1.0 | -1 |

-1.1 | -1 |

-1.6 | -1 |

-2.5 | -2 |

-5.5 | -5 |

* `RoundingModeHalfUp` default mode for `GetPayable()` |

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.
*Note that this is the rounding mode commonly taught at school.*

`price` |
`price.GetPayableByRoundingMode(RoundingModeHalfUp, 1)` |
---|---|

5.5 | 6 |

2.5 | 3 |

1.6 | 2 |

1.1 | 1 |

1.0 | 1 |

-1.0 | -1 |

-1.1 | -1 |

-1.6 | -2 |

-2.5 | -3 |

-5.5 | -6 |

`RoundingModeHalfDown`

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.

`price` |
`price.GetPayableByRoundingMode(RoundingModeHalfDown, 1)` |
---|---|

5.5 | 5 |

2.5 | 2 |

1.6 | 2 |

1.1 | 1 |

1.0 | 1 |

-1.0 | -1 |

-1.1 | -1 |

-1.6 | -2 |

-2.5 | -2 |

-5.5 | -5 |

## Charge:¶

Represents a price together with a type. A charge has a values price (normally in default currency) and a the price that is paid that might be in a different currency. Can be used in places where you need to give the price value a certain extra semantic information or to represent something that need to be paid (charged).

## Template Func - Formatting a Price Object¶

Just use the template function commercePriceFormat like this: `commercePriceFormat(priceObject)`

The template functions used the configurations of the Flamingo "locale" package. For more details on the configuration options please read there.