Categorygithub.com/Rhymond/go-money
modulepackage
1.0.14
Repository: https://github.com/rhymond/go-money.git
Documentation: pkg.go.dev

# README

Money

alt text

Go Report Card Coverage Status GoDoc License: MIT

GoMoney provides ability to work with monetary value using a currency's smallest unit. This package provides basic and precise Money operations such as rounding, splitting and allocating. Monetary values should not be stored as floats due to small rounding differences.

package main

import (
  "log"

  "github.com/Rhymond/go-money"
)

func main() {
    pound := money.New(100, money.GBP)
    twoPounds, err := pound.Add(pound)

    if err != nil {
        log.Fatal(err)
    }

    parties, err := twoPounds.Split(3)

    if err != nil {
        log.Fatal(err)
    }

    parties[0].Display() // £0.67
    parties[1].Display() // £0.67
    parties[2].Display() // £0.66
}

Quick start

Get the package:

$ go get github.com/Rhymond/go-money

Features

  • Provides a Money struct which stores information about an Money amount value and its currency.
  • Provides a Money.Amount struct which encapsulates all information about a monetary unit.
  • Represents monetary values as integers, in cents. This avoids floating point rounding errors.
  • Represents currency as Money.Currency instances providing a high level of flexibility.

Usage

Initialization

Initialize Money by using smallest unit value (e.g 100 represents 1 pound). Use ISO 4217 Currency Code to set money Currency. Note that constants are also provided for all ISO 4217 currency codes.

pound := money.New(100, money.GBP)

Or initialize Money using the direct amount.

quarterEuro := money.NewFromFloat(0.25, money.EUR)

Comparison

Go-money provides base compare operations like:

  • Equals
  • GreaterThan
  • GreaterThanOrEqual
  • LessThan
  • LessThanOrEqual
  • Compare

Comparisons must be made between the same currency units.

pound := money.New(100, money.GBP)
twoPounds := money.New(200, money.GBP)
twoEuros := money.New(200, money.EUR)

pound.GreaterThan(twoPounds) // false, nil
pound.LessThan(twoPounds) // true, nil
twoPounds.Equals(twoEuros) // false, error: Currencies don't match
twoPounds.Compare(pound) // 1, nil
pound.Compare(twoPounds) // -1, nil
pound.Compare(pound) // 0, nil
pound.Compare(twoEuros) // pound.amount, ErrCurrencyMismatch

Asserts

  • IsZero
  • IsNegative
  • IsPositive

Zero value

To assert if Money value is equal to zero use IsZero()

pound := money.New(100, money.GBP)
result := pound.IsZero() // false

Positive value

To assert if Money value is more than zero use IsPositive()

pound := money.New(100, money.GBP)
pound.IsPositive() // true

Negative value

To assert if Money value is less than zero use IsNegative()

pound := money.New(100, money.GBP)
pound.IsNegative() // false

Operations

  • Add
  • Subtract
  • Multiply
  • Absolute
  • Negative

Comparisons must be made between the same currency units.

Addition

Additions can be performed using Add().

pound := money.New(100, money.GBP)
twoPounds := money.New(200, money.GBP)

result, err := pound.Add(twoPounds) // £3.00, nil

Subtraction

Subtraction can be performed using Subtract().

pound := money.New(100, money.GBP)
twoPounds := money.New(200, money.GBP)

result, err := pound.Subtract(twoPounds) // -£1.00, nil

Multiplication

Multiplication can be performed using Multiply().

pound := money.New(100, money.GBP)

result := pound.Multiply(2) // £2.00

Absolute

Return absolute value of Money structure

pound := money.New(-100, money.GBP)

result := pound.Absolute() // £1.00

Negative

Return negative value of Money structure

pound := money.New(100, money.GBP)

result := pound.Negative() // -£1.00

Allocation

  • Split
  • Allocate

Splitting

In order to split Money for parties without losing any pennies due to rounding differences, use Split().

After division leftover pennies will be distributed round-robin amongst the parties. This means that parties listed first will likely receive more pennies than ones that are listed later.

pound := money.New(100, money.GBP)
parties, err := pound.Split(3)

if err != nil {
    log.Fatal(err)
}

parties[0].Display() // £0.34
parties[1].Display() // £0.33
parties[2].Display() // £0.33

Allocation

To perform allocation operation use Allocate().

It splits money using the given ratios without losing pennies and as Split operations distributes leftover pennies amongst the parties with round-robin principle.

pound := money.New(100, money.GBP)
// Allocate is variadic function which can receive ratios as
// slice (int[]{33, 33, 33}...) or separated by a comma integers
parties, err := pound.Allocate(33, 33, 33)

if err != nil {
    log.Fatal(err)
}

parties[0].Display() // £0.34
parties[1].Display() // £0.33
parties[2].Display() // £0.33

Format

To format and return Money as a string use Display().

money.New(123456789, money.EUR).Display() // €1,234,567.89

To format and return Money as a float64 representing the amount value in the currency's subunit use AsMajorUnits().

money.New(123456789, money.EUR).AsMajorUnits() // 1234567.89

Contributing

Thank you for considering contributing! Please use GitHub issues and Pull Requests for contributing.

License

The MIT License (MIT). Please see License File for more information.

forthebadge

# Functions

AddCurrency lets you insert or update currency in currencies list.
GetCurrency returns the currency given the code.
New creates and returns new instance of Money.
NewFormatter creates new Formatter instance.
NewFromFloat creates and returns new instance of Money from a float64.

# Constants

Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
DefaultDBMoneyValueSeparator is the default value for DBMoneyValueSeparator; can be used to reset the active separator value.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.
Constants for active currency codes according to the ISO 4217 standard.

# Variables

DBMoneyValueSeparator is used to join together the Amount and Currency components of money.Money instances allowing them to be stored as strings (via the driver.Valuer interface) and unmarshalled as strings (via the sql.Scanner interface); set this value to use a different separator.
ErrCurrencyMismatch happens when two compared Money don't have the same currency.
ErrInvalidJSONUnmarshal happens when the default money.UnmarshalJSON fails to unmarshal Money because of invalid data.
MarshalJSON is injection point of json.Marshaller for money.Money.
UnmarshalJSON is injection point of json.Unmarshaller for money.Money.

# Structs

Currency represents money currency information required for formatting.
Formatter stores Money formatting information.
Money represents monetary value information, stores currency and amount value.

# Type aliases

Amount is a data structure that stores the amount being used for calculations.
No description provided by the author