本文目录导读:

在 PHP 项目中处理哥伦比亚比索(COP) 和 eCOP(数字哥伦比亚比索) 时,主要涉及货币格式化、单位换算以及交易逻辑的处理,下面为你列出关键要点和代码示例。
基本概念区分
- COP (哥伦比亚比索):传统法定货币,符号 或
COL$,最小单位是比索(没有辅币,即分)。 - eCOP (数字比索):由哥伦比亚央行(Banco de la República)发行的数字版法定货币,与 COP 保持 1:1 等值,主要用于电子支付场景。
核心结论:在数值上,1 eCOP = 1 COP,但在应用中,通常需要通过一个字段或标志来区分资金类型(如:type: 'cop' | 'ecop')。
PHP 数字与格式化处理
货币金额存储
- 为避免浮点数精度问题,建议以整数存储最小单位(比索),即金额为 1000 COP 时,数据库存
1000。 - eCOP 同样存为整数。
格式化输出
<?php
/**
* 格式化哥伦比亚比索金额
* @param int $amount 金额(比索单位)
* @param string $type 'cop' 或 'ecop'
* @return string
*/
function formatColombianPeso(int $amount, string $type = 'cop'): string {
$symbol = ($type === 'ecop') ? 'e$' : '$'; // 常用符号区分
// 哥伦比亚格式:千位用小数点 . ,小数部分用逗号 , (但COP无小数)
$formatted = number_format($amount, 0, ',', '.');
return $symbol . $formatted;
}
// 示例
echo formatColombianPeso(15000); // $15.000
echo formatColombianPeso(15000, 'ecop'); // e$15.000
?>
汇率和单位换算(虽然 1:1)
你可能需要显示两者转换:
<?php
function copToEcop(int $amount): int {
return $amount; // 1:1
}
function ecopToCop(int $amount): int {
return $amount; // 1:1
}
?>
数据库设计建议
| 字段 | 类型 | 说明 |
|---|---|---|
currency_type |
ENUM('cop','ecop') | 区分传统比索和数字比索 |
amount |
BIGINT | 整数,存储最小单位(比索) |
decimal_places |
TINYINT | 固定为 0(COP无小数) |
示例表结构:
CREATE TABLE transactions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
amount BIGINT NOT NULL COMMENT '金额(比索)',
currency_type ENUM('cop','ecop') NOT NULL DEFAULT 'cop',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
业务逻辑注意事项
- 交易限制:某些场景可能限定仅使用 eCOP(例如政府补贴、数字钱包),需在业务校验时检查
currency_type。 - 余额混合:如果用户同时拥有 COP 和 eCOP 余额,求和时需保持类型分离,避免混合使用。
- 国际化 (i18n):使用
intl扩展时,哥伦比亚地区代码为es_CO:$fmt = new NumberFormatter('es_CO', NumberFormatter::DECIMAL); echo $fmt->format(15000); // 输出: 15.000
实际场景示例:交易记录类
<?php
class CurrencyService {
/**
* 创建一笔交易(支持两种货币类型)
*/
public function createTransaction(int $amount, string $type): bool {
if (!in_array($type, ['cop', 'ecop'])) {
throw new InvalidArgumentException('无效货币类型');
}
// 验证金额为正整数
if ($amount <= 0) {
throw new InvalidArgumentException('金额必须大于0');
}
// 插入数据库(略)
return true;
}
/**
* 获取用户总余额(分别统计)
*/
public function getUserBalances(int $userId): array {
// ... 查询数据库
return [
'cop' => 100000, // 假设值
'ecop' => 25000,
];
}
}
?>
技术选型建议
- 使用 decimal 类型 或 整数 存储金额(避免 float)。
- 若涉及外部支付网关(如 Bancolombia、Nequi、DaviPlata),其 API 通常以 整数(比索) 传输。
- eCOP 的链上/智能合约交互可能需要额外库(如 Web3.php),但 PHP 中简单地用 1:1 映射即可。
- 数值上:COP 与 eCOP 完全相同(1:1)。
- 逻辑上:需要
type字段区分,确保合规和账务清晰。 - 格式化:使用
number_format加符号前缀 或e$,千分位用 分隔。 - 安全:始终使用整数或高精度库(BCMath)处理金额计算。
如果还需要具体的支付网关对接代码或更复杂的业务逻辑,可以提供更多上下文。