1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-14 10:52:41 +01:00
phorge-phorge/src/applications/phortune/currency/PhortuneCurrency.php
epriestley 5263c2d0f3 Show prices in "$... USD" in Phortune
Summary:
Ref T2787. See discussion in D5834.

  - Replace `PhortuneUtil` with `PhortuneCurrency`, which feels a little better and more flexible / future-proof.
  - Add unit tests.
  - Display prices explicitly as "$... USD".

Test Plan: Hit product list, cart, purchase flow, verified displays.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T2787

Differential Revision: https://secure.phabricator.com/D5841
2013-05-06 18:04:45 -07:00

95 lines
1.9 KiB
PHP

<?php
final class PhortuneCurrency {
private $value;
private $currency;
private function __construct() {
// Intentionally private.
}
public static function newFromUserInput(PhabricatorUser $user, $string) {
$matches = null;
$ok = preg_match(
'/^([-$]*(?:\d+)?(?:[.]\d{0,2})?)(?:\s+([A-Z]+))?$/',
trim($string),
$matches);
if (!$ok) {
self::throwFormatException($string);
}
$value = $matches[1];
if (substr_count($value, '-') > 1) {
self::throwFormatException($string);
}
if (substr_count($value, '$') > 1) {
self::throwFormatException($string);
}
$value = str_replace('$', '', $value);
$value = (float)$value;
$value = (int)round(100 * $value);
$currency = idx($matches, 2, 'USD');
if ($currency) {
switch ($currency) {
case 'USD':
break;
default:
throw new Exception("Unsupported currency '{$currency}'!");
}
}
$obj = new PhortuneCurrency();
$obj->value = $value;
$obj->currency = $currency;
return $obj;
}
public static function newFromUSDCents($cents) {
if (!is_int($cents)) {
throw new Exception("USDCents value is not an integer!");
}
$obj = new PhortuneCurrency();
$obj->value = $cents;
$obj->currency = 'USD';
return $obj;
}
public function formatForDisplay() {
$bare = $this->formatBareValue();
return '$'.$bare.' USD';
}
public function formatBareValue() {
switch ($this->currency) {
case 'USD':
return sprintf('%.02f', $this->value / 100);
default:
throw new Exception("Unsupported currency!");
}
}
public function getValue() {
return $this->value;
}
public function getCurrency() {
return $this->currency;
}
private static function throwFormatException($string) {
throw new Exception("Invalid currency format ('{$string}').");
}
}