本文目录导读:

针对PHP项目中处理印度卢比(INR) 与 eINR(数字印度卢比/央行数字货币) 的转换和展示需求,以下是一份详细的代码实现方案和注意事项。
核心功能需求分析
- 货币单位:INR(物理卢比,两位小数)、eINR(数字卢比,通常也是两位小数,但需区分展示)
- 转换逻辑:
- 1 INR = 1 eINR(等值兑换,无汇率差)
- 但需要在UI上清晰标识是“数字卢比”还是“实物卢比”
- 格式化:印度数字格式(千分位、拉克、克若尔)
PHP 实现代码
1 货币转换类
<?php
class RupeeConverter
{
// 1 INR = 1 eINR,但保留转换方法便于未来扩展
const CONVERSION_RATE = 1.0;
/**
* INR 转换为 eINR
* @param float $inrAmount
* @return float
*/
public static function inrToEinr(float $inrAmount): float
{
return round($inrAmount * self::CONVERSION_RATE, 2);
}
/**
* eINR 转换为 INR
* @param float $einrAmount
* @return float
*/
public static function einrToInr(float $einrAmount): float
{
return round($einrAmount / self::CONVERSION_RATE, 2);
}
/**
* 格式化印度数字(支持拉克、克若尔)
* @param float $amount
* @param string $currencySymbol 可选:₹ 或 e₹
* @return string
*/
public static function formatIndianRupee(float $amount, string $currencySymbol = '₹'): string
{
// 处理负数
$negative = $amount < 0;
$amount = abs($amount);
// 拆分整数和小数
$formatted = number_format($amount, 2, '.', '');
$parts = explode('.', $formatted);
$integerPart = $parts[0];
$decimalPart = $parts[1] ?? '00';
// 印度格式:最后三位一组,之前两位一组
$lastThree = substr($integerPart, -3);
$remaining = substr($integerPart, 0, -3);
if ($remaining !== '') {
$remaining = preg_replace('/\B(?=(\d{2})+(?!\d))/', ',', $remaining);
$integerPart = $remaining . ',' . $lastThree;
}
$result = $currencySymbol . $integerPart . '.' . $decimalPart;
return $negative ? '-' . $result : $result;
}
/**
* 带货币类型标记的格式化
* @param float $amount
* @param string $type 'INR' 或 'eINR'
* @return string
*/
public static function formatWithType(float $amount, string $type = 'INR'): string
{
$symbol = ($type === 'eINR') ? 'e₹' : '₹';
$code = ($type === 'eINR') ? ' eINR' : ' INR';
return self::formatIndianRupee($amount, $symbol) . $code;
}
}
2 使用示例
// 1. 基础转换 $inrAmount = 1250000.50; $einrAmount = RupeeConverter::inrToEinr($inrAmount); echo "INR: " . RupeeConverter::formatIndianRupee($inrAmount); // ₹12,50,000.50 // 2. 带类型显示 echo RupeeConverter::formatWithType($inrAmount, 'INR'); // ₹12,50,000.50 INR echo RupeeConverter::formatWithType($einrAmount, 'eINR'); // e₹12,50,000.50 eINR // 3. 反向转换 $backToInr = RupeeConverter::einrToInr($einrAmount); echo "Back to INR: " . RupeeConverter::formatIndianRupee($backToInr); // ₹12,50,000.50
3 数据库存储建议
-- 字段设计:同时保留金额和类型
CREATE TABLE transactions (
id INT PRIMARY KEY AUTO_INCREMENT,
amount DECIMAL(18,2) NOT NULL,
currency_type ENUM('INR', 'eINR') NOT NULL DEFAULT 'INR',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 如果需要转换显示,在应用层做
专有名词对照表
| 英文 | 中文说明 |
|---|---|
| Rupee | 卢比(印度货币单位) |
| INR | 印度卢比(实物货币,ISO代码) |
| eINR | 数字印度卢比(央行数字货币) |
| Lakh | 拉克(10万) |
| Crore | 克若尔(1000万) |
| Decimal | 小数点(INR两位小数) |
| Currency Symbol | 货币符号(₹ 或 e₹) |
注意事项
- 汇率固定:当前实现采用1:1兑换,如果未来央行引入浮动汇率,需要改为从API获取实时汇率。
- 符号区分:eINR使用
e₹前缀,不要与普通₹混淆。 - 单位显示:建议在UI上明确标注
INR与eINR代码,避免用户混淆。 - 精度处理:使用
decimal或float时注意精度,建议用number_format控制显示。 - 国际化:如果项目需要全球部署,考虑使用PHP的
IntlNumberFormatter替代手动格式化。
完整示例(含命令行测试)
// 命令行测试
echo "=== Rupee Converter Demo ===\n";
$testAmount = 12345678.99;
echo "INR Amount: " . RupeeConverter::formatWithType($testAmount, 'INR') . "\n";
echo "eINR Amount: " . RupeeConverter::formatWithType($testAmount, 'eINR') . "\n";
echo "---\n";
echo "eINR back to INR: " . RupeeConverter::formatWithType(
RupeeConverter::einrToInr($testAmount), 'INR'
) . "\n";
// 输出:
// INR Amount: ₹1,23,45,678.99 INR
// eINR Amount: e₹1,23,45,678.99 eINR
// eINR back to INR: ₹1,23,45,678.99 INR