From 671359762112e49852e671c49e293cdeeb167445 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 2 Jan 2018 06:39:34 +0100 Subject: [PATCH] Fix #1087 --- app/Import/Converter/Amount.php | 32 +++++++++++++++++----- tests/Unit/Import/Converter/AmountTest.php | 5 ++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/Import/Converter/Amount.php b/app/Import/Converter/Amount.php index a72065ea49..802664269a 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -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; + + } } diff --git a/tests/Unit/Import/Converter/AmountTest.php b/tests/Unit/Import/Converter/AmountTest.php index d1bf70c520..aa63fc1c2b 100644 --- a/tests/Unit/Import/Converter/AmountTest.php +++ b/tests/Unit/Import/Converter/AmountTest.php @@ -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;