diff options
Diffstat (limited to 'MLEB/cldr/CldrCurrencies.php')
-rw-r--r-- | MLEB/cldr/CldrCurrencies.php | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/MLEB/cldr/CldrCurrencies.php b/MLEB/cldr/CldrCurrencies.php new file mode 100644 index 00000000..c0ba240d --- /dev/null +++ b/MLEB/cldr/CldrCurrencies.php @@ -0,0 +1,152 @@ +<?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 MWException + */ + private static function loadData( $data ) { + + //bail if we already have it + if ( isset( self::$cache[$data] ) ) { + return; + } + + $filename = null; + switch ( $data ) { + case 'symbols' : + $filename = dirname( __FILE__ ) . '/CldrCurrency/Symbols.php'; + $value['symbols'] = 'currencySymbols'; + break; + case 'fractions' : + case 'locale' : + $filename = dirname( __FILE__ ) . '/CldrSupplemental/Supplemental.php'; + $value['fractions'] = 'currencyFractions'; + $value['locale'] = 'localeCurrencies'; + break; + default: + throw new MWException( "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']; + } + } +} |