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 );
 | |
| 	}
 | |
| 
 | |
| }
 |