237 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Currency
 | 
						|
 *
 | 
						|
 * @package   easy-digital-downloads
 | 
						|
 * @copyright Copyright (c) 2021, Sandhills Development, LLC
 | 
						|
 * @license   GPL2+
 | 
						|
 * @since     3.0
 | 
						|
 */
 | 
						|
 | 
						|
namespace EDD\Currency;
 | 
						|
 | 
						|
class Currency {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Currency code.
 | 
						|
	 */
 | 
						|
	public $code;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Symbol/text to display before amounts.
 | 
						|
	 */
 | 
						|
	public $prefix;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Symbol/text to display after amounts.
 | 
						|
	 */
 | 
						|
	public $suffix;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Symbol to use in the prefix/suffix.
 | 
						|
	 */
 | 
						|
	public $symbol;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Decimal separator.
 | 
						|
	 */
 | 
						|
	public $decimal_separator = '.';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Thousands separator.
 | 
						|
	 */
 | 
						|
	public $thousands_separator = ',';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var int Number of decimals.
 | 
						|
	 */
 | 
						|
	public $number_decimals = 2;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Currency constructor.
 | 
						|
	 *
 | 
						|
	 * @param string $currency_code
 | 
						|
	 */
 | 
						|
	public function __construct( $currency_code ) {
 | 
						|
		$this->code = strtoupper( $currency_code );
 | 
						|
 | 
						|
		$this->setup();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns a new currency object.
 | 
						|
	 *
 | 
						|
	 * @param string $currency_code
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return Currency
 | 
						|
	 */
 | 
						|
	public static function from_code( $currency_code ) {
 | 
						|
		return new self( $currency_code );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sets up properties.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 */
 | 
						|
	private function setup() {
 | 
						|
		$this->symbol              = $this->get_symbol();
 | 
						|
		$this->decimal_separator   = edd_get_option( 'decimal_separator', '.' );
 | 
						|
		$this->thousands_separator = edd_get_option( 'thousands_separator', ',' );
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Filters the decimal separator.
 | 
						|
		 *
 | 
						|
		 * @param string $decimal_separator
 | 
						|
		 * @param string $code
 | 
						|
		 *
 | 
						|
		 * @since 3.0
 | 
						|
		 */
 | 
						|
		$this->decimal_separator = apply_filters( 'edd_currency_decimal_separator', $this->decimal_separator, $this->code );
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Filters the thousands separator.
 | 
						|
		 *
 | 
						|
		 * @param string $thousands_separator
 | 
						|
		 * @param string $code
 | 
						|
		 *
 | 
						|
		 * @since 3.0
 | 
						|
		 */
 | 
						|
		$this->thousands_separator = apply_filters( 'edd_currency_thousands_separator', $this->thousands_separator, $this->code );
 | 
						|
 | 
						|
		$separator = $this->_has_space_around_symbol() ? ' ' : '';
 | 
						|
		if ( 'before' === edd_get_option( 'currency_position', 'before' ) ) {
 | 
						|
			$this->prefix = $this->symbol . $separator;
 | 
						|
		} else {
 | 
						|
			$this->suffix = $separator . $this->symbol;
 | 
						|
		}
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Filters the currency prefix.
 | 
						|
		 *
 | 
						|
		 * @param string $prefix
 | 
						|
		 * @param string $code
 | 
						|
		 *
 | 
						|
		 * @since 3.0
 | 
						|
		 */
 | 
						|
		$this->prefix = apply_filters( 'edd_currency_prefix', $this->prefix, $this->code );
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Filters the currency suffix.
 | 
						|
		 *
 | 
						|
		 * @param string $prefix
 | 
						|
		 * @param string $code
 | 
						|
		 *
 | 
						|
		 * @since 3.0
 | 
						|
		 */
 | 
						|
		$this->suffix = apply_filters( 'edd_currency_suffix', $this->suffix, $this->code );
 | 
						|
 | 
						|
		$this->number_decimals = $this->_is_zero_decimal() ? 0 : 2;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Whether or not this currency has a space between the symbol and the amount.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	private function _has_space_around_symbol() {
 | 
						|
		return ! in_array( $this->code, array(
 | 
						|
			'GBP',
 | 
						|
			'BRL',
 | 
						|
			'EUR',
 | 
						|
			'USD',
 | 
						|
			'AUD',
 | 
						|
			'CAD',
 | 
						|
			'HKD',
 | 
						|
			'MXN',
 | 
						|
			'SGD',
 | 
						|
			'JPY'
 | 
						|
		) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the symbol for this currency.
 | 
						|
	 * Depending on settings, this will be used as either the prefix or the suffix.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function get_symbol() {
 | 
						|
		switch ( $this->code ) :
 | 
						|
			case "GBP" :
 | 
						|
				$symbol = '£';
 | 
						|
				break;
 | 
						|
			case "BRL" :
 | 
						|
				$symbol = 'R$';
 | 
						|
				break;
 | 
						|
			case "EUR" :
 | 
						|
				$symbol = '€';
 | 
						|
				break;
 | 
						|
			case "USD" :
 | 
						|
			case "AUD" :
 | 
						|
			case "NZD" :
 | 
						|
			case "CAD" :
 | 
						|
			case "HKD" :
 | 
						|
			case "MXN" :
 | 
						|
			case "SGD" :
 | 
						|
				$symbol = '$';
 | 
						|
				break;
 | 
						|
			case "JPY" :
 | 
						|
				$symbol = '¥';
 | 
						|
				break;
 | 
						|
			case "AOA" :
 | 
						|
				$symbol = 'Kz';
 | 
						|
				break;
 | 
						|
			default :
 | 
						|
				$symbol = $this->code;
 | 
						|
				break;
 | 
						|
		endswitch;
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Filters the currency symbol.
 | 
						|
		 *
 | 
						|
		 * @since unknown
 | 
						|
		 *
 | 
						|
		 * @param string $symbol Currency symbol.
 | 
						|
		 * @param string $code   Currency code.
 | 
						|
		 */
 | 
						|
		return apply_filters( 'edd_currency_symbol', $symbol, $this->code );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Determines whether or not the currency is zero-decimal.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	private function _is_zero_decimal() {
 | 
						|
		$currencies = array(
 | 
						|
			'bif',
 | 
						|
			'clp',
 | 
						|
			'djf',
 | 
						|
			'gnf',
 | 
						|
			'huf',
 | 
						|
			'jpy',
 | 
						|
			'kmf',
 | 
						|
			'krw',
 | 
						|
			'mga',
 | 
						|
			'pyg',
 | 
						|
			'rwf',
 | 
						|
			'ugx',
 | 
						|
			'vnd',
 | 
						|
			'vuv',
 | 
						|
			'xaf',
 | 
						|
			'xof',
 | 
						|
			'xpf',
 | 
						|
		);
 | 
						|
 | 
						|
		return in_array( strtolower( $this->code ), $currencies, true );
 | 
						|
	}
 | 
						|
 | 
						|
}
 |