PHP项目数字印度卢比与eINR

wen PHP项目 1

本文目录导读:

PHP项目数字印度卢比与eINR

  1. 核心功能需求分析
  2. PHP 实现代码
  3. 专有名词对照表
  4. 注意事项
  5. 完整示例(含命令行测试)

针对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:1兑换,如果未来央行引入浮动汇率,需要改为从API获取实时汇率。
  2. 符号区分:eINR使用 e₹ 前缀,不要与普通₹混淆。
  3. 单位显示:建议在UI上明确标注 INReINR 代码,避免用户混淆。
  4. 精度处理:使用 decimalfloat 时注意精度,建议用 number_format 控制显示。
  5. 国际化:如果项目需要全球部署,考虑使用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

抱歉,评论功能暂时关闭!