Skip to content

Commit

Permalink
FIX Handle non-breakable spaces
Browse files Browse the repository at this point in the history
Fixes issue #11162
  • Loading branch information
lekoala authored and michalkleiner committed Mar 11, 2024
1 parent f0b799c commit fcf5e32
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 33 deletions.
12 changes: 11 additions & 1 deletion src/Forms/NumericField.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,20 @@ protected function getNumberType()
return NumberFormatter::TYPE_DOUBLE;
}

/**
* In some cases and locales, validation expects non-breaking spaces.
* This homogenises regular, narrow and thin non-breaking spaces to a regular space character.
*
*/
private function clean(?string $value): string
{
return trim(str_replace(["\u{00A0}", "\u{202F}", "\u{2009}"], ' ', $value ?? ''));
}

public function setSubmittedValue($value, $data = null)
{
// Save original value in case parse fails
$value = trim($value ?? '');
$value = $this->clean($value);
$this->originalValue = $value;

// Empty string is no-number (not 0)
Expand Down
43 changes: 11 additions & 32 deletions tests/php/Forms/NumericFieldTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,6 @@ class NumericFieldTest extends SapphireTest
{
protected $usesDatabase = false;

/**
* In some cases and locales, validation expects non-breaking spaces.
* This homogenises narrow and regular NBSPs to a regular space character
*
* Duplicates non-public NumericField::clean method
*
* @param string $input
* @return string The input value, with all non-breaking spaces replaced with spaces
*/
protected function clean($input)
{
return str_replace(
[
html_entity_decode(' ', 0, 'UTF-8'),
html_entity_decode(' ', 0, 'UTF-8'), // narrow non-breaking space
],
' ',
trim($input ?? '')
);
}

/**
* Test that data loaded in via Form::loadDataFrom(DataObject) will populate the field correctly,
* and can format the database value appropriately for the frontend
Expand Down Expand Up @@ -64,8 +43,8 @@ public function testSetValue($locale, $scale, $input, $output)

// Test expected formatted value
$this->assertEquals(
$this->clean($output),
$this->clean($field->Value()),
(string) $output,
$field->Value(),
"Expected $input to be formatted as $output in locale $locale"
);

Expand All @@ -92,11 +71,11 @@ public function dataForTestSetValue()
['nl_NL', null, '12.1', '12,1'],
['nl_NL', 1, '14000.5', "14.000,5"],
// fr
['fr_FR', 0, '13000', "13 000"],
['fr_FR', 0, '13000', "13000"], // With a narrow non breaking space
['fr_FR', 0, '15', '15'],
['fr_FR', null, '12.0', '12,0'],
['fr_FR', null, '12.1', '12,1'],
['fr_FR', 1, '14000.5', "14 000,5"],
['fr_FR', 1, '14000.5', "14000,5"], // With a narrow non breaking space
// us
['en_US', 0, '13000', "13,000"],
['en_US', 0, '15', '15'],
Expand Down Expand Up @@ -175,15 +154,15 @@ public function dataForTestSubmittedValue()
['nl_NL', 1, '15,000.5', false],

// fr
['fr_FR', 0, '13000', 13000, '13 000'],
['fr_FR', 0, '13000', 13000, '13000'], // With a narrow non breaking space
['fr_FR', 2, '12,00', 12.0],
['fr_FR', 2, '12.00', false],
['fr_FR', 1, '11 000', 11000, '11 000,0'],
['fr_FR', 0, '11.000', 11000, '11 000'],
['fr_FR', 1, '11 000', 11000, '11000,0'], // With a narrow non breaking space
['fr_FR', 0, '11.000', 11000, '11000'], // With a narrow non breaking space
['fr_FR', null, '11,000', 11.000, '11,0'],
['fr_FR', 1, '15 000,5', 15000.5],
['fr_FR', 1, '15 000,5', 15000.5, '15 000,5'], // With a narrow non breaking space
['fr_FR', 1, '15 000.5', false],
['fr_FR', 1, '15.000,5', 15000.5, '15 000,5'],
['fr_FR', 1, '15.000,5', 15000.5, '15000,5'], // With a narrow non breaking space
['fr_FR', 1, '15,000.5', false],
// us
['en_US', 0, '13000', 13000, '13,000'],
Expand Down Expand Up @@ -260,8 +239,8 @@ public function testSetSubmittedValue($locale, $scale, $submittedValue, $dataVal
$cleanedInput = $submittedValue;
}
$this->assertEquals(
$this->clean($cleanedInput),
$this->clean($field->Value()),
$cleanedInput,
$field->Value(),
"Expected input $submittedValue to be cleaned up as $cleanedInput in locale $locale"
);
}
Expand Down

0 comments on commit fcf5e32

Please sign in to comment.