Updated FormatConverter to Format Price based on Currency (if provided)

- Fixes #176 Issue
- Renamed formatToTwoDecimalPlaces to formatToNumber
This commit is contained in:
japatel
2014-12-08 17:11:33 -06:00
parent 8bb80cb843
commit 7c4a16ca3d
8 changed files with 106 additions and 15 deletions

View File

@@ -55,7 +55,7 @@ class Amount extends PPModel
public function setTotal($total)
{
NumericValidator::validate($total, "Total");
$total = FormatConverter::formatToTwoDecimalPlaces($total);
$total = FormatConverter::formatToPrice($total, $this->getCurrency());
$this->total = $total;
return $this;
}

View File

@@ -28,7 +28,7 @@ class Cost extends PPModel
public function setPercent($percent)
{
NumericValidator::validate($percent, "Percent");
$percent = FormatConverter::formatToTwoDecimalPlaces($percent);
$percent = FormatConverter::formatToNumber($percent);
$this->percent = $percent;
return $this;
}

View File

@@ -51,7 +51,7 @@ class Currency extends PPModel
public function setValue($value)
{
NumericValidator::validate($value, "Value");
$value = FormatConverter::formatToTwoDecimalPlaces($value);
$value = FormatConverter::formatToPrice($value, $this->getCurrency());
$this->value = $value;
return $this;
}

View File

@@ -36,7 +36,7 @@ class Details extends PPModel
public function setShipping($shipping)
{
NumericValidator::validate($shipping, "Shipping");
$shipping = FormatConverter::formatToTwoDecimalPlaces($shipping);
$shipping = FormatConverter::formatToPrice($shipping);
$this->shipping = $shipping;
return $this;
}
@@ -62,7 +62,7 @@ class Details extends PPModel
public function setSubtotal($subtotal)
{
NumericValidator::validate($subtotal, "SubTotal");
$subtotal = FormatConverter::formatToTwoDecimalPlaces($subtotal);
$subtotal = FormatConverter::formatToPrice($subtotal);
$this->subtotal = $subtotal;
return $this;
}
@@ -89,7 +89,7 @@ class Details extends PPModel
public function setTax($tax)
{
NumericValidator::validate($tax, "Tax");
$tax = FormatConverter::formatToTwoDecimalPlaces($tax);
$tax = FormatConverter::formatToPrice($tax);
$this->tax = $tax;
return $this;
}
@@ -115,7 +115,7 @@ class Details extends PPModel
public function setFee($fee)
{
NumericValidator::validate($fee, "Fee");
$fee = FormatConverter::formatToTwoDecimalPlaces($fee);
$fee = FormatConverter::formatToPrice($fee);
$this->fee = $fee;
return $this;
}
@@ -141,7 +141,7 @@ class Details extends PPModel
public function setShippingDiscount($shipping_discount)
{
NumericValidator::validate($shipping_discount, "Shipping Discount");
$shipping_discount = FormatConverter::formatToTwoDecimalPlaces($shipping_discount);
$shipping_discount = FormatConverter::formatToPrice($shipping_discount);
$this->shipping_discount = $shipping_discount;
return $this;
}
@@ -192,7 +192,7 @@ class Details extends PPModel
public function setInsurance($insurance)
{
NumericValidator::validate($insurance, "Insurance");
$insurance = FormatConverter::formatToTwoDecimalPlaces($insurance);
$insurance = FormatConverter::formatToPrice($insurance);
$this->insurance = $insurance;
return $this;
}
@@ -218,7 +218,7 @@ class Details extends PPModel
public function setHandlingFee($handling_fee)
{
NumericValidator::validate($handling_fee, "Handling Fee");
$handling_fee = FormatConverter::formatToTwoDecimalPlaces($handling_fee);
$handling_fee = FormatConverter::formatToPrice($handling_fee);
$this->handling_fee = $handling_fee;
return $this;
}
@@ -268,7 +268,7 @@ class Details extends PPModel
public function setGiftWrap($gift_wrap)
{
NumericValidator::validate($gift_wrap, "Gift Wrap");
$gift_wrap = FormatConverter::formatToTwoDecimalPlaces($gift_wrap);
$gift_wrap = FormatConverter::formatToPrice($gift_wrap);
$this->gift_wrap = $gift_wrap;
return $this;
}

View File

@@ -113,7 +113,7 @@ class Item extends PPModel
{
NumericValidator::validate($price, "Price");
$price = FormatConverter::formatToTwoDecimalPlaces($price);
$price = FormatConverter::formatToPrice($price, $this->getCurrency());
$this->price = $price;
return $this;
}
@@ -139,7 +139,7 @@ class Item extends PPModel
public function setTax($tax)
{
NumericValidator::validate($tax, "Tax");
$tax = FormatConverter::formatToTwoDecimalPlaces($tax);
$tax = FormatConverter::formatToPrice($tax, $this->getCurrency());
$this->tax = $tax;
return $this;
}

View File

@@ -19,14 +19,56 @@ class FormatConverter {
/**
* Format the input data to two decimal places
*
* @deprecated Use formatToNumber instead
* @param $value
* @return string
*/
public static function formatToTwoDecimalPlaces($value)
{
return self::formatToNumber($value);
}
/**
* Format the input data with decimal places
*
* Defaults to 2 decimal places
*
* @param $value
* @param int $decimals
* @return null|string
*/
public static function formatToNumber($value, $decimals = 2)
{
if (trim($value) != null) {
return number_format($value, 2, '.', '');
return number_format($value, $decimals, '.', '');
}
return null;
}
/**
* Helper method to format price values with associated currency information.
*
* It covers the cases where certain currencies does not accept decimal values. We will be adding
* any specific currency level rules as required here.
*
* @param $value
* @param null $currency
* @return null|string
*/
public static function formatToPrice($value, $currency = null)
{
$decimals = 2;
$currencyDecimals = array('JPY' => 0, 'TWD' => 0);
if ($currency && array_key_exists($currency, $currencyDecimals)) {
if (strpos($value, ".") !== false && (floor($value) != $value)) {
//throw exception if it has decimal values for JPY and TWD which does not ends with .00
throw new \InvalidArgumentException("value cannot have decimals for $currency currency");
}
$decimals = $currencyDecimals[$currency];
} else if (strpos($value, ".") === false) {
// Check if value has decimal values. If not no need to assign 2 decimals with .00 at the end
$decimals = 0;
}
return self::formatToNumber($value, $decimals);
}
}

View File

@@ -12,7 +12,8 @@ use PayPal\Test\Validation\NumericValidatorTest;
class FormatConverterTest extends \PHPUnit_Framework_TestCase
{
public static function classMethodListProvider(){
public static function classMethodListProvider()
{
return array(
array(new Item(), 'Price'),
array(new Item(), 'Tax'),
@@ -29,6 +30,14 @@ class FormatConverterTest extends \PHPUnit_Framework_TestCase
);
}
public static function CurrencyListWithNoDecimalsProvider()
{
return array(
array('JPY'),
array('TWD')
);
}
public static function apiModelSettersProvider()
{
$provider = array();
@@ -62,6 +71,44 @@ class FormatConverterTest extends \PHPUnit_Framework_TestCase
}
/**
* @dataProvider CurrencyListWithNoDecimalsProvider
*/
public function testPriceWithNoDecimalCurrencyInvalid($input)
{
try {
FormatConverter::formatToPrice("1.234", $input);
} catch (\InvalidArgumentException $ex) {
$this->assertContains("value cannot have decimals for", $ex->getMessage());
}
}
/**
* @dataProvider CurrencyListWithNoDecimalsProvider
*/
public function testPriceWithNoDecimalCurrencyValid($input)
{
$result = FormatConverter::formatToPrice("1.0000000", $input);
$this->assertEquals("1", $result);
}
/**
*
* @dataProvider \PayPal\Test\Validation\NumericValidatorTest::positiveProvider
*/
public function testFormatToNumber($input, $expected)
{
$result = FormatConverter::formatToNumber($input);
$this->assertEquals($expected, $result);
}
public function testFormatToNumberDecimals()
{
$result = FormatConverter::formatToNumber("0.0", 4);
$this->assertEquals("0.0000", $result);
}
public function testFormat()
{
$result = FormatConverter::format("12.0123", "%0.2f");

View File

@@ -10,6 +10,8 @@ class NumericValidatorTest extends \PHPUnit_Framework_TestCase
public static function positiveProvider()
{
return array(
array(".5", "0.50"),
array(".55", "0.55"),
array("0", "0.00"),
array(null, null),
array("01", "1.00"),