如何实现PHP双向货币价格转换函数?现有正向函数需反向实现
实现双向货币与价格转换的方案
嘿,我来帮你搞定这个双向转换的需求!你已经有了从货币数量转价格的getPrice函数,那反向转换和双向整合的实现其实很直观,咱们一步步来:
1. 先实现反向转换的私有函数
这个函数会接收价格$amount和平台$platform,返回对应的货币数量。逻辑就是把getPrice的计算过程倒过来:
- 先从数据库获取对应平台的每10k货币单价
- 用输入的价格除以单价,得到有多少个“10k单位”
- 再乘以10000得到最终的货币数量(注意转成整数,因为数量是整数类型)
// $amount (float) 要转换的价格,比如3.50 // $platform (string) 取值为XBOX或PS private function getAmount($platform, $amount) { $priceData = DB::table('platform_prices')->where('platform', $platform)->first(); // 计算逻辑:(价格 / 每10k单价) * 10000 $unitCount = $amount / $priceData->price_per_10k; $currencyAmount = (int)($unitCount * 10000); // 可选:验证结果是否在规定的数量范围(10000-1000000)内 if ($currencyAmount < 10000 || $currencyAmount > 1000000) { // 这里可以抛出异常、返回null或者其他处理逻辑 return null; } return $currencyAmount; }
测试一下:调用$this->getAmount('XBOX', 3.50);就会返回50000,完美匹配你的示例!
2. 整合为双向转换函数
如果想更方便地统一调用,可以写一个顶层函数,通过参数指定转换方向:
// $value 要转换的值(可以是int类型的货币数量,也可以是float类型的价格) // $platform 平台(XBOX/PS) // $direction 转换方向:'to_price'(数量转价格)或 'to_amount'(价格转数量) public function convert($value, $platform, $direction) { $priceData = DB::table('platform_prices')->where('platform', $platform)->first(); if (!$priceData) { // 平台不存在的处理逻辑 return null; } switch ($direction) { case 'to_price': // 验证输入的数量是否在合法范围 if (!is_int($value) || $value < 10000 || $value > 1000000) { return null; } return $value / 10000 * $priceData->price_per_10k; case 'to_amount': // 验证输入的价格是否为正数 if (!is_float($value) || $value <= 0) { return null; } $amount = (int)(($value / $priceData->price_per_10k) * 10000); // 验证结果是否在合法数量范围 return ($amount >=10000 && $amount <=1000000) ? $amount : null; default: // 无效转换方向的处理 return null; } }
这样调用的时候就很灵活:
- 数量转价格:
$this->convert(50000, 'XBOX', 'to_price'); // 返回3.50 - 价格转数量:
$this->convert(3.50, 'XBOX', 'to_amount'); // 返回50000
小提示
- 建议加上参数验证和异常处理,避免非法输入导致的错误
- 如果数据库里的
price_per_10k可能为0,要提前做判断防止除以0的错误
内容的提问来源于stack exchange,提问作者Curtis
相关产品推荐
相关产品推荐

