Skip to content

Commit db57e62

Browse files
committed
Fix number trim in case of multibyte characters
1 parent 6514870 commit db57e62

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

src/Formatter/CurrencyFormatter.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use CommerceGuys\Intl\Exception\UnknownCurrencyException;
99
use CommerceGuys\Intl\NumberFormat\NumberFormat;
1010
use CommerceGuys\Intl\NumberFormat\NumberFormatRepositoryInterface;
11+
use CommerceGuys\Intl\Calculator;
1112

1213
/**
1314
* Formats currency amounts using locale-specific patterns.
@@ -96,7 +97,7 @@ public function format($number, $currencyCode, array $options = [])
9697
$message = sprintf('The provided value "%s" is not a valid number or numeric string.', $number);
9798
throw new InvalidArgumentException($message);
9899
}
99-
100+
$negative = (Calculator::compare('0', $number, 12) == 1);
100101
$this->validateOptions($options);
101102
$options = array_replace($this->defaultOptions, $options);
102103
$numberFormat = $this->getNumberFormat($options['locale']);
@@ -117,8 +118,9 @@ public function format($number, $currencyCode, array $options = [])
117118
$number = str_replace('¤', $currency->getCurrencyCode(), $number);
118119
} else {
119120
// No symbol should be displayed. Remove leftover whitespace.
120-
$number = str_replace('¤', '', $number);
121-
$number = trim($number, " \xC2\xA0");
121+
$negative_sign = $negative ? $numberFormat->getMinusSign() : '';
122+
$pattern = '/^' . $negative_sign . '¤*\s*(.*?)\s*¤*$/us';
123+
$number = preg_replace($pattern, $negative_sign . '$1', $number);
122124
}
123125

124126
return $number;

tests/Formatter/CurrencyFormatterTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use CommerceGuys\Intl\Formatter\CurrencyFormatter;
99
use CommerceGuys\Intl\NumberFormat\NumberFormat;
1010
use CommerceGuys\Intl\NumberFormat\NumberFormatRepository;
11+
use CommerceGuys\Intl\Tests\NumberFormat\CustomNumberFormatRepository;
1112

1213
/**
1314
* @coversDefaultClass \CommerceGuys\Intl\Formatter\CurrencyFormatter
@@ -184,6 +185,17 @@ public function testParse($locale, $currencyCode, $number, $expectedNumber)
184185
$this->assertSame($expectedNumber, $parsedNumber);
185186
}
186187

188+
/**
189+
* @covers ::format
190+
*/
191+
public function testFormatUtf8()
192+
{
193+
include __DIR__ . '/../NumberFormat/CustomNumberFormatRepository.php';
194+
$numberFormatRepository = new CustomNumberFormatRepository();
195+
$formatter = new CurrencyFormatter($numberFormatRepository, new CurrencyRepository());
196+
$this->assertSame('\xc2\xb1950.00', $formatter->format('-950.000000', 'USD', ['currency_display' => 'none', 'locale' => 'tst']));
197+
}
198+
187199
/**
188200
* Provides the number format, currency format, number style, value and expected formatted value.
189201
*/
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace CommerceGuys\Intl\Tests\NumberFormat;
4+
5+
use CommerceGuys\Intl\NumberFormat\NumberFormatRepository;
6+
7+
/**
8+
* Provides a custom number format.
9+
*/
10+
class CustomNumberFormatRepository extends NumberFormatRepository
11+
{
12+
/**
13+
* {@inheritdoc}
14+
*/
15+
protected function getDefinitions()
16+
{
17+
$return = parent::getDefinitions();
18+
$return['tst'] = [
19+
'minus_sign' => "\xc2\xb1",
20+
];
21+
return $return;
22+
}
23+
}

0 commit comments

Comments
 (0)