ZF2 表格:具有本地化功能的 NumberFormat 过滤器
ZF2 Form: NumberFormat-filter with localization
嗨,
我如何为字段集中的输入定义 NumberFormat-filter 以识别当前语言环境?我想要的是像 1000.33 这样的数字在视图中显示如下: 1.000,33 (或指定的任何语言环境)我试过了使用 InputFilterProviderInterface,但它在视图中没有任何效果:
<?php
namespace Customer\Form;
use Customer\Entity\OfferDay;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
class OfferDayFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct($em)
{
parent::__construct('offerDayFieldset');
$this->setHydrator(new DoctrineHydrator($em))
->setObject(new OfferDay());
$this->add(array(
'name' => 'price',
'type' => 'Text',
'options' => array(
'label' => '',
),
));
}
public function getInputFilterSpecification()
{
return array(
'price' => array(
'required' => false,
'filters' => array(
array(
'name' => 'NumberFormat',
'options' => array(
'locale' => 'de_DE',
),
),
),
),
);
}
}
在视图中,我通过 formRow()
函数输出输入。
我也知道您可以像这样以编程方式使用 NumberFormat-Filter (l18n Filters - Zend Framework 2):
$filter = new \Zend\I18n\Filter\NumberFormat("de_DE");
echo $filter->filter(1234567.8912346);
// Returns "1.234.567,891"
但我想使用数组表示法。
有人做过类似的事情吗?
好的,这似乎不像我想的那么微不足道:)但我找到了解决方案。
首先像这样定义过滤器:
public function getInputFilterSpecification()
{
return array(
'price' => array(
'required' => false,
'filters' => array(
array(
'name' => 'NumberFormat',
'options' => array(
'locale' => 'de_DE',
'style' => NumberFormatter::DECIMAL,
'type' => NumberFormatter::TYPE_DOUBLE,
),
),
),
),
);
}
而 locale 是当前使用的语言环境。这会将数字格式化为当前格式,然后再将其保存到数据库。
在视图中,您可以使用过滤器视图助手将数字转换为正确的格式:
<?php
$this->plugin("numberformat")
->setFormatStyle(NumberFormatter::DECIMAL)
->setFormatType(NumberFormatter::TYPE_DOUBLE)
->setLocale("de_DE");
?>
<p>
<?php
$currentElement = $form->get('price');
$currentElement->setValue($this->numberFormat($currentElement->getValue()));
echo $this->formRow($currentElement);
?>
</p>
结果:
数据库:12.345 ->
查看:12,345 -> 数据库:12.345
嗨,
我如何为字段集中的输入定义 NumberFormat-filter 以识别当前语言环境?我想要的是像 1000.33 这样的数字在视图中显示如下: 1.000,33 (或指定的任何语言环境)我试过了使用 InputFilterProviderInterface,但它在视图中没有任何效果:
<?php
namespace Customer\Form;
use Customer\Entity\OfferDay;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
class OfferDayFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct($em)
{
parent::__construct('offerDayFieldset');
$this->setHydrator(new DoctrineHydrator($em))
->setObject(new OfferDay());
$this->add(array(
'name' => 'price',
'type' => 'Text',
'options' => array(
'label' => '',
),
));
}
public function getInputFilterSpecification()
{
return array(
'price' => array(
'required' => false,
'filters' => array(
array(
'name' => 'NumberFormat',
'options' => array(
'locale' => 'de_DE',
),
),
),
),
);
}
}
在视图中,我通过 formRow()
函数输出输入。
我也知道您可以像这样以编程方式使用 NumberFormat-Filter (l18n Filters - Zend Framework 2):
$filter = new \Zend\I18n\Filter\NumberFormat("de_DE");
echo $filter->filter(1234567.8912346);
// Returns "1.234.567,891"
但我想使用数组表示法。
有人做过类似的事情吗?
好的,这似乎不像我想的那么微不足道:)但我找到了解决方案。
首先像这样定义过滤器:
public function getInputFilterSpecification()
{
return array(
'price' => array(
'required' => false,
'filters' => array(
array(
'name' => 'NumberFormat',
'options' => array(
'locale' => 'de_DE',
'style' => NumberFormatter::DECIMAL,
'type' => NumberFormatter::TYPE_DOUBLE,
),
),
),
),
);
}
而 locale 是当前使用的语言环境。这会将数字格式化为当前格式,然后再将其保存到数据库。
在视图中,您可以使用过滤器视图助手将数字转换为正确的格式:
<?php
$this->plugin("numberformat")
->setFormatStyle(NumberFormatter::DECIMAL)
->setFormatType(NumberFormatter::TYPE_DOUBLE)
->setLocale("de_DE");
?>
<p>
<?php
$currentElement = $form->get('price');
$currentElement->setValue($this->numberFormat($currentElement->getValue()));
echo $this->formRow($currentElement);
?>
</p>
结果: 数据库:12.345 -> 查看:12,345 -> 数据库:12.345