【发布时间】:2021-12-25 03:16:12
【问题描述】:
我正在尝试从欧元格式化到拉丁美洲国家。但我无法让它们全部正确格式化。
这两行工作正常:
$currencies['ESP'] = array(2, ',', '.'); // Euro
$currencies['USD'] = array(2, '.', ','); // US Dollar
那些不起作用的是这些:
-
墨西哥 我有 1,800,520 美元的墨西哥比索,我想获得这个 结果 $ 3,698.00
$currencies['MXN'] = array(3, ",", '.'); // México Peso -
哥伦比亚 $ 2,097,106.36 哥伦比亚比索,我想得到 $ 104,637,255.96
$currencies['COP'] = array(2, ',', '.'); // Colombiano Peso -
Argentina $53,609.02 阿根廷比索,我想得到 $10,490
$currencies['ARS'] = array(2, ',', '.'); // Argentina Peso
有谁知道我做错了什么?感谢您的帮助。
我的函数示例:
/**
* @param self::$curr
* @return string
*/
public static function setCurrency($tipo) {
// Creamos tipo moneda
$tipoMoneda = ($tipo =='') ? self::$curr : $tipo;
$moneda = match ($tipoMoneda) {
'CLF' => "$",
'COP' => "$",
'ARS' => "$",
'USD' => "$",
'EUR' => "€",
'MXN' => "$",
};
return $moneda;
}
/**
* Format price
* @param string
* @param string
*/
public static function toMoney($price,$tipo='') {
$currencies['EUR'] = array(2, ',', '.'); // Euro
$currencies['ESP'] = array(2, ',', '.'); // Euro
$currencies['USD'] = array(2, '.', ','); // US Dollar
$currencies['COP'] = array(2, ',', '.'); // Colombian Peso
$currencies['MXN'] = array(3, ",", '.'); // Mexico Peso
$currencies['CLP'] = array(0, '', '.'); // Chilean Peso
$currencies['ARS'] = array(2, ',', '.'); // Argentina Peso
if ($tipo == '') :
$money_format = number_format($price, ...$currencies[self::$curr]) . ' ' . self::setCurrency($tipo);
else:
$money_format = self::setCurrency($tipo) . number_format($price, ...$currencies[$tipo]);
endif;
return $money_format;
}
/**
* Calcular TAXES about original price base
* @param string
* @return string
*/
public static function CalcIva($valor, $arr =[]) {
// Get default IVA o by (USD-MXN) (COOKIE)
$getIva = self::$defaultIva;
// Price original
$price = $valor;
// Get taxes
$iva = ($getIva / 100) * $price;
// Sum taxes to base price
$precio = $price + $iva;
// On this line if $arr is not null i calculate 1.13 or some else x price
if ($arr != null) :
// Calcul exchange rate (example: 1.13 * 20)
$precio = $arr['cambio'] * $price;
endif;
// Price
return $precio;
}
设置cookie我在JS上做
/**
* Select money (header)
*/
let moneda = document.getElementById('slc-moneda');
moneda.addEventListener('change', function (e) {
// Get value option
let tipo = this.value;
// Not null
if (tipo != 0) {
// Value default, delete cookie
if (tipo == 'EUR-ES') {
// Eliminamos cookie, usamos configuracion por defecto
delCookie('moneda');
location.reload()
// Set cookie - new money format
} else {
setCookie('moneda', tipo, 365)
location.reload()
}
}
e.preventDefault()
})
【问题讨论】:
-
听起来您的格式没有问题 (
number_format),但您想进行货币换算。货币转换需要一个汇率值,然后是一些基本的乘法运算。您粘贴的所有代码都没有处理这个问题。 -
@Raxi 我有另一个函数可以计算 1.13 x 20 € = x $,我选择了国家和相应的汇率,我更新了我的问题
-
是的,添加的函数和 sqldata 可能与问题更相关,但我无法真正弄清楚问题出在哪里,因为这并不完整,而且它是西班牙语,让我很难跟着。
CalcIva中有很多行我认为奇怪/可疑,但很难确定。总体设计方面,我会说您将很多东西混合在一起(在这些类方法中),它们真的不应该在同一个地方。 -
既然您使用的是基于 OO 的设计,我想说产品(或订单)的货币价值应该与向用户呈现价值的方式完全分开(意思是他/她想要或选择的货币)。在同一个地方看到对 COOKIE 和转换数学
($getIva / 100) * $price的引用在这方面是一个尖叫的危险信号。 -
@raxi
$getIVa这是国家的税,在西班牙是21%。我在数据库中保存 decimal (5,2) 的价格,当我显示价格时,我在此函数CalcIva()中计算税金,例如 price + tax 。在我的 cookie 中,我输入了 USD-EC 的价值,所以我知道 USD-EC 来自厄瓜多尔。后来用explode() 分隔这个值。
标签: php money-format