本文目录导读:

针对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
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播