/** * Returns the name of a currency given its code. * * @param string $currencyCode The currency code * @param null|number|string The quantity identifier. Allowed values: * <ul> * <li>`null` to return the standard name, not associated to any quantity</li> * <li>`number` to return the name following the plural rule for the specified quantity</li> * <li>string `'zero'|'one'|'two'|'few'|'many'|'other'` the plural rule * </ul> * @param string $locale The locale to use. If empty we'll use the default locale set with {@link \Punic\Data::setDefaultLocale()}. * * @return string Returns an empty string if $currencyCode is not valid, the localized currency name otherwise */ public static function getName($currencyCode, $quantity = null, $locale = '') { $result = ''; $data = static::getLocaleData($currencyCode, $locale); if (is_array($data)) { $result = $data['name']; if (!is_null($quantity) && isset($data['pluralName'])) { if (is_string($data) && in_array($quantity, array('zero', 'one', 'two', 'few', 'many', 'other'))) { $pluralRule = $quantity; } else { $pluralRule = Plural::getRule($quantity, $locale); } if (!isset($data['pluralName'][$pluralRule])) { $pluralRule = 'other'; } $result = $data['pluralName'][$pluralRule]; } } return $result; }
/** * Format a unit string. * * @param int|float|string $number The unit amount * @param string $unit The unit identifier (eg 'duration/millisecond' or 'millisecond') * @param string $width The format name; it can be 'long' (eg '3 milliseconds'), 'short' (eg '3 ms') or 'narrow' (eg '3ms'). You can also add a precision specifier ('long,2' or just '2') * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data * * @return string * * @throws Exception\ValueNotInList */ public static function format($number, $unit, $width = 'short', $locale = '') { $data = Data::get('units', $locale); $precision = null; if (is_int($width)) { $precision = $width; $width = 'short'; } elseif (is_string($width) && preg_match('/^(?:(.*),)?([+\\-]?\\d+)$/', $width, $m)) { $precision = intval($m[2]); $width = $m[1]; if (!isset($width[0])) { $width = 'short'; } } if (strpos($width, '_') === 0 || !isset($data[$width])) { $widths = array(); foreach (array_keys($data) as $w) { if (strpos($w, '_') !== 0) { $widths[] = $w; } } throw new Exception\ValueNotInList($width, $widths); } $data = $data[$width]; if (strpos($unit, '/') === false) { $unitCategory = null; $unitID = null; foreach (array_keys($data) as $c) { if (strpos($c, '_') === false) { if (isset($data[$c][$unit])) { if (is_null($unitCategory)) { $unitCategory = $c; $unitID = $unit; } else { $unitCategory = null; break; } } } } } else { list($unitCategory, $unitID) = explode('/', $unit, 2); } $rules = null; if (strpos($unit, '_') === false && !is_null($unitCategory) && !is_null($unitID) && isset($data[$unitCategory]) && array_key_exists($unitID, $data[$unitCategory])) { $rules = $data[$unitCategory][$unitID]; } if (is_null($rules)) { $units = array(); foreach ($data as $c => $us) { if (strpos($c, '_') === false) { foreach (array_keys($us) as $u) { if (strpos($c, '_') === false) { $units[] = "{$c}/{$u}"; } } } } throw new \Punic\Exception\ValueNotInList($unit, $units); } $pluralRule = Plural::getRule($number, $locale); //@codeCoverageIgnoreStart // These checks aren't necessary since $pluralRule should always be in $rules, but they don't hurt ;) if (!isset($rules[$pluralRule])) { if (isset($rules['other'])) { $pluralRule = 'other'; } else { $availableRules = array_keys($rules); $pluralRule = $availableRules[0]; } } //@codeCoverageIgnoreEnd return sprintf($rules[$pluralRule], Number::format($number, $precision, $locale)); }