This commit is contained in:
James Cole 2018-01-02 06:39:34 +01:00
parent 09bd55675d
commit 6713597621
No known key found for this signature in database
GPG Key ID: C16961E655E74B5E
2 changed files with 30 additions and 7 deletions

View File

@ -45,8 +45,10 @@ class Amount implements ConverterInterface
if (null === $value) {
return '0';
}
$value = strval($value);
Log::debug(sprintf('Start with amount "%s"', $value));
$original = $value;
$value = strval($value);
$value = $this->stripAmount($value);
$len = strlen($value);
$decimalPosition = $len - 3;
$altPosition = $len - 2;
@ -81,27 +83,43 @@ class Amount implements ConverterInterface
// if decimal is dot, replace all comma's and spaces with nothing. then parse as float (round to 4 pos)
if ('.' === $decimal) {
$search = [',', ' '];
$oldValue = $value;
$value = str_replace($search, '', $value);
Log::debug(sprintf('Converted amount from "%s" to "%s".', $oldValue, $value));
Log::debug(sprintf('Converted amount from "%s" to "%s".', $original, $value));
}
if (',' === $decimal) {
$search = ['.', ' '];
$oldValue = $value;
$value = str_replace($search, '', $value);
$value = str_replace(',', '.', $value);
Log::debug(sprintf('Converted amount from "%s" to "%s".', $oldValue, $value));
Log::debug(sprintf('Converted amount from "%s" to "%s".', $original, $value));
}
if (null === $decimal) {
// replace all:
$search = ['.', ' ', ','];
$oldValue = $value;
$value = str_replace($search, '', $value);
Log::debug(sprintf('No decimal character found. Converted amount from "%s" to "%s".', $oldValue, $value));
Log::debug(sprintf('No decimal character found. Converted amount from "%s" to "%s".', $original, $value));
}
$number = strval(number_format(round(floatval($value), 12), 12, '.', ''));
return $number;
}
/**
* @param string $value
*
* @return string
*/
private function stripAmount(string $value): string
{
$str = preg_replace('/[^\-\(\)\.\,0-9 ]/', '', $value);
$len = strlen($str);
if ($str{0} === '(' && $str{$len - 1} === ')') {
$str = '-' . substr($str, 1, ($len - 2));
}
Log::debug(sprintf('Stripped "%s" away to "%s"', $value, $str));
return $str;
}
}

View File

@ -150,6 +150,11 @@ class AmountTest extends TestCase
'0.115' => '0.115',
'-0.115' => '-0.115',
'1.33' => '1.33',
'$1.23' => '1.23',
'€1,44' => '1.44',
'(33.52)' => '-33.52',
'€(63.12)' => '-63.12',
'($182.77)' => '-182.77',
];
foreach ($values as $value => $expected) {
$converter = new Amount;