first commit
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
package currency
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Currency represents a currency with its details
|
||||
type Currency struct {
|
||||
Code string
|
||||
Name string
|
||||
Symbol string
|
||||
}
|
||||
|
||||
// SupportedCurrencies returns a list of supported currencies
|
||||
func SupportedCurrencies() []Currency {
|
||||
return []Currency{
|
||||
{Code: "EUR", Name: "Euro", Symbol: "€"},
|
||||
{Code: "USD", Name: "US Dollar", Symbol: "$"},
|
||||
{Code: "GBP", Name: "British Pound", Symbol: "£"},
|
||||
{Code: "CHF", Name: "Swiss Franc", Symbol: "CHF"},
|
||||
{Code: "SEK", Name: "Swedish Krona", Symbol: "kr"},
|
||||
{Code: "NOK", Name: "Norwegian Krone", Symbol: "kr"},
|
||||
{Code: "DKK", Name: "Danish Krone", Symbol: "kr"},
|
||||
{Code: "PLN", Name: "Polish Zloty", Symbol: "zł"},
|
||||
{Code: "CZK", Name: "Czech Koruna", Symbol: "Kč"},
|
||||
{Code: "HUF", Name: "Hungarian Forint", Symbol: "Ft"},
|
||||
{Code: "CAD", Name: "Canadian Dollar", Symbol: "C$"},
|
||||
{Code: "AUD", Name: "Australian Dollar", Symbol: "A$"},
|
||||
{Code: "JPY", Name: "Japanese Yen", Symbol: "¥"},
|
||||
{Code: "CNY", Name: "Chinese Yuan", Symbol: "¥"},
|
||||
{Code: "RUB", Name: "Russian Ruble", Symbol: "₽"},
|
||||
{Code: "BRL", Name: "Brazilian Real", Symbol: "R$"},
|
||||
{Code: "MXN", Name: "Mexican Peso", Symbol: "$"},
|
||||
{Code: "INR", Name: "Indian Rupee", Symbol: "₹"},
|
||||
{Code: "KRW", Name: "South Korean Won", Symbol: "₩"},
|
||||
{Code: "SGD", Name: "Singapore Dollar", Symbol: "S$"},
|
||||
{Code: "HKD", Name: "Hong Kong Dollar", Symbol: "HK$"},
|
||||
{Code: "NZD", Name: "New Zealand Dollar", Symbol: "NZ$"},
|
||||
{Code: "ZAR", Name: "South African Rand", Symbol: "R"},
|
||||
{Code: "TRY", Name: "Turkish Lira", Symbol: "₺"},
|
||||
{Code: "ILS", Name: "Israeli Shekel", Symbol: "₪"},
|
||||
}
|
||||
}
|
||||
|
||||
// GetCurrency returns a currency by its code
|
||||
func GetCurrency(code string) (*Currency, bool) {
|
||||
code = strings.ToUpper(code)
|
||||
for _, currency := range SupportedCurrencies() {
|
||||
if currency.Code == code {
|
||||
return ¤cy, true
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// GetCurrencySymbol returns the symbol for a currency code
|
||||
func GetCurrencySymbol(code string) string {
|
||||
if currency, exists := GetCurrency(code); exists {
|
||||
return currency.Symbol
|
||||
}
|
||||
return code // fallback to code if currency not found
|
||||
}
|
||||
|
||||
// GetCurrencyName returns the name for a currency code
|
||||
func GetCurrencyName(code string) string {
|
||||
if currency, exists := GetCurrency(code); exists {
|
||||
return currency.Name
|
||||
}
|
||||
return code // fallback to code if currency not found
|
||||
}
|
||||
|
||||
// FormatPrice formats a price with the appropriate currency symbol
|
||||
func FormatPrice(amount float64, currencyCode string) string {
|
||||
symbol := GetCurrencySymbol(currencyCode)
|
||||
|
||||
// Handle currencies with different formatting conventions
|
||||
switch strings.ToUpper(currencyCode) {
|
||||
case "EUR", "GBP", "CHF":
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
case "USD", "CAD", "AUD", "HKD", "SGD", "NZD", "BRL", "MXN":
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
case "JPY", "KRW":
|
||||
// Yen and Won typically don't use decimal places
|
||||
return fmt.Sprintf("%s%.0f", symbol, amount)
|
||||
case "SEK", "NOK", "DKK":
|
||||
// Scandinavian currencies often put symbol after
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "PLN":
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "CZK":
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "HUF":
|
||||
return fmt.Sprintf("%.0f %s", amount, symbol)
|
||||
case "RUB":
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "INR":
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
case "CNY":
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
case "ZAR":
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
case "TRY":
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "ILS":
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
default:
|
||||
return fmt.Sprintf("%s%.2f", symbol, amount)
|
||||
}
|
||||
}
|
||||
|
||||
// FormatPricePerLiter formats a price per liter with the appropriate currency symbol
|
||||
func FormatPricePerLiter(amount float64, currencyCode string) string {
|
||||
symbol := GetCurrencySymbol(currencyCode)
|
||||
|
||||
// Handle currencies with different formatting conventions
|
||||
switch strings.ToUpper(currencyCode) {
|
||||
case "EUR", "GBP", "CHF":
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
case "USD", "CAD", "AUD", "HKD", "SGD", "NZD", "BRL", "MXN":
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
case "JPY", "KRW":
|
||||
// Yen and Won typically don't use decimal places
|
||||
return fmt.Sprintf("%s%.0f", symbol, amount)
|
||||
case "SEK", "NOK", "DKK":
|
||||
return fmt.Sprintf("%.3f %s", amount, symbol)
|
||||
case "PLN":
|
||||
return fmt.Sprintf("%.3f %s", amount, symbol)
|
||||
case "CZK":
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "HUF":
|
||||
return fmt.Sprintf("%.0f %s", amount, symbol)
|
||||
case "RUB":
|
||||
return fmt.Sprintf("%.2f %s", amount, symbol)
|
||||
case "INR":
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
case "CNY":
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
case "ZAR":
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
case "TRY":
|
||||
return fmt.Sprintf("%.3f %s", amount, symbol)
|
||||
case "ILS":
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
default:
|
||||
return fmt.Sprintf("%s%.3f", symbol, amount)
|
||||
}
|
||||
}
|
||||
|
||||
// IsValidCurrency checks if a currency code is supported
|
||||
func IsValidCurrency(code string) bool {
|
||||
_, exists := GetCurrency(code)
|
||||
return exists
|
||||
}
|
||||
|
||||
// GetDefaultCurrency returns the default currency
|
||||
func GetDefaultCurrency() Currency {
|
||||
return Currency{Code: "EUR", Name: "Euro", Symbol: "€"}
|
||||
}
|
||||
Reference in New Issue
Block a user