我正在尝试为不同的货币(例如Euro,Doller等)实施货币格式化程序类。 我试图创建一个抽象类,并希望从这个类扩展Euro和Doller类。
由于我是PHP的新手,并且不知道这是否是更好的方式来实现这样的想法。
abstract class Currency {
private $name;
private $symbol;
private $decimal;
private $decimal_point;
private $thousand_sep;
function __construct() {
}
function setName($name) {
$this->name = $name;
}
function getName() {
return $this->name;
}
function setSymbol($symbol) {
$this->symbol = $symbol;
}
function getSymbol() {
return $symbol;
}
function setDecimal($decimal) {
$this->decimal = $decimal;
}
function getDecimal() {
return $this->decimal;
}
function setDecimalPoint($decimal_point) {
$this->decimal_point = $decimal_point;
}
function getDecimalPoint() {
$this->decimal_point;
}
function setThousandSeprator($thousand_sep) {
$this->thousand_sep = $thousand_sep;
}
function getThousandSeprator() {
return $this->thousand_sep;
}
function display() {
return $this->symbol . number_format($this->amount, $this->decimal, $this->decimal_point, $this->thousand_sep);
}
}
答案 0 :(得分:2)
你知道PHP5.3与intl PECL捆绑在一起,因此知道NumberFormatter应该能够做你想在这里构建的内容吗?
<?php
$value = 9988776.65;
$nf = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $nf->formatCurrency($value, "EUR") . "\n";
echo $nf->formatCurrency($value, "USD") . "\n";
$nf = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $nf->formatCurrency($value, "EUR") . "\n";
echo $nf->formatCurrency($value, "USD") . "\n";
答案 1 :(得分:1)
当你有一些子类实现不同的功能时,使用抽象超类是有意义的。例如,您希望以不同方式显示欧元和美元,然后您可以定义display()函数abstract并让子类实现它。
abstract class Currency {
..
..
abstract function display();
}
class Dollar extends Currency {
function display() {
//display dollar
}
}
class Euro extends Currency {
function display() {
//display euro
}
}
答案 2 :(得分:1)
我认为你不需要所有那些setter,因为分隔符,小数点等在格式化程序生命周期中不会改变。如果你想让你的班级做的就是格式化货币,我认为你也不需要所有的吸气剂。
如果您的班级只负责格式化,我认为您不应该将值保留为类字段;也许更好的方法是将其作为参数传递给display()
。
这样的事情怎么样:
abstract class CurrencyFormatter {
protected $name;
protected $symbol;
protected $decimal;
protected $decimal_point;
protected $thousand_sep;
function format($amount) {
return $this->symbol . number_format($amount, $this->decimal, $this->decimal_point, $this->thousand_sep);
}
}
class EuroFormatter extends CurrencyFormatter {
public function __construct() {
$this->name = "Euro";
$this->symbol = "E";
$this->decimal = 2;
$this->decimal_point = ".";
$this->thousand_sep = ",";
}
}
然后,您可以像这样使用它:
$formattedAmount = new EuroFormatter()->format(123);
答案 3 :(得分:1)
我会使用当前的区域设置来显示相关的小数点,千位分隔符等,然后使用number_format()
来显示它。
在英国我们会说$12,345.67
; €12,345.67
和£12,345.67
。
在法国,他们会说$12.345,67
; €12.345,67
和£12.345,67
。
换句话说,格式不依赖于货币而是依赖于区域设置。
然而,根抽象类Currency是一个好主意 - 子类可能只需要覆盖$symbol
,他们就这样做:
abstract class Currency {
abstract private $symbol;
/*...*/
}
class GBP extends Currency {
private $symbol = "£";
}
即。因为它不会改变,所以不需要为此设置getter / setter。