%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/cldr/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/cldr/CldrCurrencies.php |
<?php
/**
* A class for getting currency-related data from cldr
*
* @author Katie Horn
* @copyright Copyright © 2007-2013
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class CldrCurrency {
private static $cache = array();
/**
* Loads the file which contains the relevant data
* @param string $data 'symbols' | 'fractions' | 'locale'
* @throws Exception
*/
private static function loadData( $data ) {
//bail if we already have it
if ( isset( self::$cache[$data] ) ) {
return;
}
$filename = null;
switch ( $data ) {
case 'symbols' :
$filename = __DIR__ . '/CldrCurrency/Symbols.php';
$value['symbols'] = 'currencySymbols';
break;
case 'fractions' :
case 'locale' :
$filename = __DIR__ . '/CldrSupplemental/Supplemental.php';
$value['fractions'] = 'currencyFractions';
$value['locale'] = 'localeCurrencies';
break;
default:
throw new Exception( "Invalid 'data' parameter:\$data in " . __METHOD__ );
}
//go get it
if ( file_exists( $filename ) ) {
require_once $filename;
}
foreach ( $value as $dataname => $varname ) {
self::$cache[$dataname] = $$varname;
}
}
/**
* getSymbol returns a symbol for the relevant currency that should be
* recognized notation for that currency in the specified language and
* optionally specified country.
*
* NOTE: This function will always perform more reliably if a country is
* specified
*
* @param string $currency_code ISO 4217 3-character currency code.
* @param string $language_code ISO 639 2-character language code.
* @param string $country_code ISO 3166-1 Alpha-2 country code (optional)
* @return string The symbol for the specified currency, language, and country
*/
public static function getSymbol( $currency_code, $language_code, $country_code = null ) {
self::loadData( 'symbols' );
if ( array_key_exists( strtoupper( $currency_code ), self::$cache['symbols'] ) ) {
$currency_code = strtoupper( $currency_code );
$language_code = strtolower( $language_code );
if ( !is_null( $country_code ) ) {
$country_code = strtoupper( $country_code );
if ( $country_code === 'UK' ) {
$country_code = 'GB'; //dang iso overlap...
}
}
//get the default (either the 'root' language, or the original ISO code)
$default = $currency_code;
if ( array_key_exists( 'root', self::$cache['symbols'][$currency_code] ) ) {
$default = self::$cache['symbols'][$currency_code]['root'];
}
//language code might or might not exist
if ( array_key_exists( $language_code, self::$cache['symbols'][$currency_code] ) ) {
if ( is_array( self::$cache['symbols'][$currency_code][$language_code] ) ) {
//did we specify a country? If not: Default.
if ( !is_null( $country_code ) &&
array_key_exists(
$country_code,
self::$cache['symbols'][$currency_code][$language_code]
)
) {
return self::$cache['symbols'][$currency_code][$language_code][$country_code];
} elseif ( array_key_exists(
'DEFAULT',
self::$cache['symbols'][$currency_code][$language_code]
) ) {
return self::$cache['symbols'][$currency_code][$language_code]['DEFAULT'];
} else {
return $default;
}
} else {
return self::$cache['symbols'][$currency_code][$language_code];
}
} else {
return $default;
}
} else {
//we have no idea what you were going for, so you can have your old code back.
return $currency_code;
}
}
/**
* getCurrenciesByCountry returns an ordered list of ISO 4217 3-character
* currency codes that are valid in the specified country.
*
* @param string $country_code ISO 3166-1 Alpha-2 country code
* @return array An array of indicies and currency codes, or an empty array
* if no valid currency is found.
*/
public static function getCurrenciesByCountry( $country_code ) {
self::loadData( 'locale' );
$country_code = strtoupper( $country_code );
if ( $country_code === 'UK' ) {
$country_code = 'GB'; //iso overlap again
}
if ( array_key_exists( $country_code, self::$cache['locale'] ) ) {
return self::$cache['locale'][$country_code];
} else {
return array();
}
}
/**
* getDecimalPlaces returns a number specifying how many decimal places the
* requested currency supports.
*
* @param string $currency_code ISO 4217 3-character currency code.
* @return int The number of decimal places for the relevant currency (0 for nonfractional)
*/
public static function getDecimalPlaces( $currency_code ) {
self::loadData( 'fractions' );
$currency_code = strtoupper( $currency_code );
if ( array_key_exists( $currency_code, self::$cache['fractions'] ) ) {
return (int)self::$cache['fractions'][$currency_code]['digits'];
} else {
return (int)self::$cache['fractions']['DEFAULT']['digits'];
}
}
}