diff --git a/src/Form/Type/ExponentialNumberType.php b/src/Form/Type/ExponentialNumberType.php index 4f2d54bd..b76196d9 100644 --- a/src/Form/Type/ExponentialNumberType.php +++ b/src/Form/Type/ExponentialNumberType.php @@ -27,6 +27,7 @@ use App\Form\Type\Helper\ExponentialNumberTransformer; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\NumberType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; /** * Similar to the NumberType, but formats small values in scienfitic notation instead of rounding it to 0, like NumberType @@ -38,6 +39,14 @@ class ExponentialNumberType extends AbstractType return NumberType::class; } + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + //We want to allow the full precision of the number, so disable rounding + 'scale' => null, + ]); + } + public function buildForm(FormBuilderInterface $builder, array $options) { $builder->resetViewTransformers(); diff --git a/src/Form/Type/Helper/ExponentialNumberTransformer.php b/src/Form/Type/Helper/ExponentialNumberTransformer.php index e7f730b7..ee2f4a4c 100644 --- a/src/Form/Type/Helper/ExponentialNumberTransformer.php +++ b/src/Form/Type/Helper/ExponentialNumberTransformer.php @@ -33,11 +33,12 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStrin class ExponentialNumberTransformer extends NumberToLocalizedStringTransformer { public function __construct( - protected ?int $scale = null, + private ?int $scale = null, ?bool $grouping = false, ?int $roundingMode = \NumberFormatter::ROUND_HALFUP, protected ?string $locale = null ) { + //Set scale to null, to disable rounding of values parent::__construct($scale, $grouping, $roundingMode, $locale); } @@ -85,12 +86,28 @@ class ExponentialNumberTransformer extends NumberToLocalizedStringTransformer $formatter = new \NumberFormatter($this->locale ?? \Locale::getDefault(), \NumberFormatter::SCIENTIFIC); if (null !== $this->scale) { - $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->scale); + $formatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $this->scale); $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode); } $formatter->setAttribute(\NumberFormatter::GROUPING_USED, (int) $this->grouping); + return $formatter; + } + + protected function getNumberFormatter(): \NumberFormatter + { + $formatter = parent::getNumberFormatter(); + + //Unset the fraction digits, as we don't want to round the number + $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, 0); + if (null !== $this->scale) { + $formatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $this->scale); + } else { + $formatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 100); + } + + return $formatter; } } \ No newline at end of file