Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit dc80385

Browse filesBrowse files
committed
[Form] Fixed NumberToLocalizedStringTransformer to accept both comma and dot as decimal separator, if possible
1 parent 5c57bbb commit dc80385
Copy full SHA for dc80385

File tree

Expand file treeCollapse file tree

2 files changed

+104
-3
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+104
-3
lines changed

‎src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php
+11Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ public function reverseTransform($value)
104104
}
105105

106106
$formatter = $this->getNumberFormatter();
107+
$groupSep = $formatter->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL);
108+
$decSep = $formatter->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);
109+
110+
if ('.' !== $decSep && (!$this->grouping || '.' !== $groupSep)) {
111+
$value = str_replace('.', $decSep, $value);
112+
}
113+
114+
if (',' !== $decSep && (!$this->grouping || ',' !== $groupSep)) {
115+
$value = str_replace(',', $decSep, $value);
116+
}
117+
107118
$value = $formatter->parse($value);
108119

109120
if (intl_is_failure($formatter->getErrorCode())) {

‎tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php
+93-3Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,104 @@ public function testReverseTransformWithGrouping()
8888
{
8989
$transformer = new NumberToLocalizedStringTransformer(null, true);
9090

91+
// completely valid format
9192
$this->assertEquals(1234.5, $transformer->reverseTransform('1.234,5'));
9293
$this->assertEquals(12345.912, $transformer->reverseTransform('12.345,912'));
94+
// omit group separator
9395
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
9496
$this->assertEquals(12345.912, $transformer->reverseTransform('12345,912'));
9597
}
9698

99+
public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsNotDot()
100+
{
101+
\Locale::setDefault('fr');
102+
$transformer = new NumberToLocalizedStringTransformer(null, true);
103+
104+
// completely valid format
105+
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
106+
// accept dots
107+
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
108+
// omit group separator
109+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
110+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
111+
}
112+
113+
/**
114+
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
115+
*/
116+
public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDot()
117+
{
118+
$transformer = new NumberToLocalizedStringTransformer(null, true);
119+
120+
$transformer->reverseTransform('1.234.5');
121+
}
122+
123+
/**
124+
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
125+
*/
126+
public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDot_noGroupSep()
127+
{
128+
$transformer = new NumberToLocalizedStringTransformer(null, true);
129+
130+
$transformer->reverseTransform('1234.5');
131+
}
132+
133+
public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsDotButNoGroupingUsed()
134+
{
135+
\Locale::setDefault('fr');
136+
$transformer = new NumberToLocalizedStringTransformer();
137+
138+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
139+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
140+
}
141+
142+
public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsNotComma()
143+
{
144+
\Locale::setDefault('ak');
145+
$transformer = new NumberToLocalizedStringTransformer(null, true);
146+
147+
// completely valid format
148+
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
149+
// accept commas
150+
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
151+
// omit group separator
152+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
153+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
154+
}
155+
156+
/**
157+
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
158+
*/
159+
public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsComma()
160+
{
161+
\Locale::setDefault('en');
162+
$transformer = new NumberToLocalizedStringTransformer(null, true);
163+
164+
$transformer->reverseTransform('1,234,5');
165+
}
166+
167+
/**
168+
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
169+
*/
170+
public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsComma_noGroupSep()
171+
{
172+
\Locale::setDefault('en');
173+
$transformer = new NumberToLocalizedStringTransformer(null, true);
174+
175+
$transformer->reverseTransform('1234,5');
176+
}
177+
178+
public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGroupingUsed()
179+
{
180+
\Locale::setDefault('en');
181+
$transformer = new NumberToLocalizedStringTransformer();
182+
183+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
184+
$this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
185+
}
186+
97187
/**
98-
* @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
188+
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
99189
*/
100190
public function testTransformExpectsNumeric()
101191
{
@@ -105,7 +195,7 @@ public function testTransformExpectsNumeric()
105195
}
106196

107197
/**
108-
* @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
198+
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
109199
*/
110200
public function testReverseTransformExpectsString()
111201
{
@@ -115,7 +205,7 @@ public function testReverseTransformExpectsString()
115205
}
116206

117207
/**
118-
* @expectedException Symfony\Component\Form\Exception\TransformationFailedException
208+
* @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
119209
*/
120210
public function testReverseTransformExpectsValidNumber()
121211
{

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.