Преглед на файлове

新增数字助手类:实现万分位数据表示转换功能

- 创建 UCore\Helper\Number 类
- 实现 formatToWan() 方法:将数字转换为中文万分位表示(如 100020 -> 10万20)
- 实现 parseFromWan() 方法:万分位表示转换回数字
- 实现 smartFormat() 方法:智能选择格式化方式
- 实现 formatThousands() 方法:标准千分位格式化
- 支持正负数、整数、小数的处理
- 添加详细的使用说明文档
notfff преди 7 месеца
родител
ревизия
bf7b67b601
променени са 4 файла, в които са добавени 265 реда и са изтрити 4 реда
  1. 137 0
      UCore/Helper/Number.php
  2. 116 0
      UCore/Helper/README_Number.md
  3. 8 2
      app/Module/Fund/Models/FundModel.php
  4. 4 2
      app/Module/Game/AdminControllers/UserController.php

+ 137 - 0
UCore/Helper/Number.php

@@ -0,0 +1,137 @@
+<?php
+
+namespace UCore\Helper;
+
+/**
+ * 数字助手类
+ * 
+ * 提供数字格式化、转换等功能
+ */
+class Number
+{
+    /**
+     * 万分位数据表示转换
+     * 
+     * 将数字转换为中文万分位表示法
+     * 例如:100020 -> "10万20"
+     * 
+     * @param int|float|string $number 要转换的数字
+     * @return string 万分位表示的字符串
+     */
+    public static function formatToWan($number): string
+    {
+        // 转换为数字类型
+        $num = (float) $number;
+        
+        // 处理负数
+        $isNegative = $num < 0;
+        $num = abs($num);
+        
+        // 处理小数部分
+        $integerPart = (int) $num;
+        $decimalPart = $num - $integerPart;
+        
+        $result = '';
+        
+        // 处理整数部分的万分位转换
+        if ($integerPart >= 10000) {
+            $wan = (int) ($integerPart / 10000);
+            $remainder = $integerPart % 10000;
+            
+            $result = $wan . '万';
+            
+            // 如果余数不为0,添加余数
+            if ($remainder > 0) {
+                $result .= $remainder;
+            }
+        } else {
+            // 小于1万的直接显示
+            $result = (string) $integerPart;
+        }
+        
+        // 处理小数部分(如果有)
+        if ($decimalPart > 0) {
+            // 保留2位小数,去除末尾的0
+            $decimalStr = rtrim(sprintf('%.2f', $decimalPart), '0');
+            $decimalStr = rtrim($decimalStr, '.');
+            if ($decimalStr !== '0' && $decimalStr !== '') {
+                $result .= substr($decimalStr, 1); // 去掉开头的"0"
+            }
+        }
+        
+        // 添加负号
+        if ($isNegative) {
+            $result = '-' . $result;
+        }
+        
+        return $result;
+    }
+    
+    /**
+     * 格式化数字为千分位表示
+     * 
+     * @param int|float|string $number 要格式化的数字
+     * @param int $decimals 小数位数,默认0
+     * @return string 千分位格式的字符串
+     */
+    public static function formatThousands($number, int $decimals = 0): string
+    {
+        return number_format((float) $number, $decimals);
+    }
+    
+    /**
+     * 智能数字格式化
+     * 
+     * 根据数字大小自动选择合适的格式化方式
+     * 
+     * @param int|float|string $number 要格式化的数字
+     * @param bool $useWan 是否使用万分位表示,默认true
+     * @return string 格式化后的字符串
+     */
+    public static function smartFormat($number, bool $useWan = true): string
+    {
+        $num = (float) $number;
+        
+        if ($useWan && abs($num) >= 10000) {
+            return self::formatToWan($number);
+        }
+        
+        return self::formatThousands($number);
+    }
+    
+    /**
+     * 将万分位表示转换回数字
+     *
+     * 例如:"10万20" -> 100020
+     *
+     * @param string $wanString 万分位表示的字符串
+     * @return int|float 转换后的数字
+     */
+    public static function parseFromWan(string $wanString)
+    {
+        // 处理负数
+        $isNegative = str_starts_with($wanString, '-');
+        if ($isNegative) {
+            $wanString = substr($wanString, 1);
+        }
+
+        // 查找"万"字符
+        $wanPos = mb_strpos($wanString, '万');
+
+        if ($wanPos === false) {
+            // 没有"万"字符,直接转换为数字
+            $result = (float) $wanString;
+        } else {
+            // 有"万"字符,分别处理万和余数部分
+            $wanPart = mb_substr($wanString, 0, $wanPos);
+            $remainderPart = mb_substr($wanString, $wanPos + 1);
+
+            $wan = (float) $wanPart;
+            $remainder = empty($remainderPart) ? 0 : (float) $remainderPart;
+
+            $result = $wan * 10000 + $remainder;
+        }
+
+        return $isNegative ? -$result : $result;
+    }
+}

+ 116 - 0
UCore/Helper/README_Number.md

@@ -0,0 +1,116 @@
+# 数字助手类使用说明
+
+## 概述
+
+`UCore\Helper\Number` 类提供了数字格式化和转换功能,特别是中文万分位表示法的转换。
+
+## 主要功能
+
+### 1. 万分位数据表示转换 `formatToWan()`
+
+将数字转换为中文万分位表示法:
+
+```php
+use UCore\Helper\Number;
+
+// 基本用法
+echo Number::formatToWan(100020);    // 输出: 10万20
+echo Number::formatToWan(50000);     // 输出: 5万
+echo Number::formatToWan(10000);     // 输出: 1万
+echo Number::formatToWan(9999);      // 输出: 9999
+echo Number::formatToWan(123456);    // 输出: 12万3456
+echo Number::formatToWan(1000000);   // 输出: 100万
+
+// 支持负数
+echo Number::formatToWan(-100020);   // 输出: -10万20
+
+// 支持小数
+echo Number::formatToWan(100020.5);  // 输出: 10万20.5
+echo Number::formatToWan(50000.99);  // 输出: 5万.99
+```
+
+### 2. 反向转换 `parseFromWan()`
+
+将万分位表示转换回数字:
+
+```php
+echo Number::parseFromWan('10万20');   // 输出: 100020
+echo Number::parseFromWan('5万');      // 输出: 50000
+echo Number::parseFromWan('1万');      // 输出: 10000
+echo Number::parseFromWan('12万3456'); // 输出: 123456
+echo Number::parseFromWan('-10万20');  // 输出: -100020
+```
+
+### 3. 智能格式化 `smartFormat()`
+
+根据数字大小自动选择合适的格式化方式:
+
+```php
+// 大于等于1万使用万分位表示
+echo Number::smartFormat(100020);  // 输出: 10万20
+echo Number::smartFormat(50000);   // 输出: 5万
+
+// 小于1万使用千分位表示
+echo Number::smartFormat(9999);    // 输出: 9,999
+echo Number::smartFormat(1234);    // 输出: 1,234
+
+// 可以禁用万分位表示
+echo Number::smartFormat(100020, false);  // 输出: 100,020
+```
+
+### 4. 千分位格式化 `formatThousands()`
+
+标准的千分位数字格式化:
+
+```php
+echo Number::formatThousands(100020);     // 输出: 100,020
+echo Number::formatThousands(123456.789, 2); // 输出: 123,456.79
+```
+
+## 在后台控制器中的使用示例
+
+### 替换现有的 number_format
+
+原代码:
+```php
+$balance = number_format($account->balance);
+```
+
+使用万分位表示:
+```php
+use UCore\Helper\Number;
+
+$balance = Number::formatToWan($account->balance);
+```
+
+### 在Grid中使用
+
+```php
+$grid->column('balance', '余额')->display(function ($value) {
+    return Number::formatToWan($value);
+});
+```
+
+### 在Show页面中使用
+
+```php
+$show->field('balance', '余额')->as(function ($value) {
+    return Number::formatToWan($value);
+});
+```
+
+## 特性
+
+- **支持多种数据类型**:整数、浮点数、字符串数字
+- **处理负数**:自动识别和处理负数
+- **小数支持**:保留小数部分并智能格式化
+- **双向转换**:支持数字到万分位和万分位到数字的转换
+- **智能选择**:根据数字大小自动选择最合适的显示方式
+- **中文友好**:使用中文"万"字符,符合中文数字表示习惯
+
+## 注意事项
+
+1. 万分位转换只在数字大于等于10000时生效
+2. 小数部分会保留最多2位小数,自动去除末尾的0
+3. 反向转换支持标准的万分位格式字符串
+4. 所有方法都是静态方法,可以直接调用

+ 8 - 2
app/Module/Fund/Models/FundModel.php

@@ -16,7 +16,7 @@ use UCore\ModelCore;
  * 每个账户对应一种账户种类(FundConfigModel)。
  * 同一币种可以有多个不同用途的账户,如可用账户、冻结账户等。
  *
- * field start 
+ * field start
  * @property  int  $id  自增
  * @property  int  $user_id  用户ID
  * @property  \App\Module\Fund\Enums\FUND_TYPE  $fund_id  资金ID
@@ -31,7 +31,7 @@ class FundModel extends ModelCore
     protected $table      = 'fund';
     public    $timestamps = false;
 
-    // attrlist start 
+    // attrlist start
     protected $fillable = [
         'id',
         'user_id',
@@ -93,6 +93,12 @@ class FundModel extends ModelCore
         return $this->hasOne(User::class, 'id', 'user_id');
     }
 
+
+    public function fund_config()
+    {
+        return $this->hasOne(FundConfigModel::class, 'id', 'fund_id');
+
+    }
     //
     public function userInfo()
     {

+ 4 - 2
app/Module/Game/AdminControllers/UserController.php

@@ -54,7 +54,7 @@ class UserController extends AdminController
      */
     protected function grid()
     {
-        return Grid::make(new UserRepository(['info', 'primaryPhone', 'farmUser', 'fundAccounts', 'items.item', 'lands.landType', 'crops.seed']), function (Grid $grid) {
+        return Grid::make(new UserRepository(['info', 'primaryPhone', 'farmUser', 'fundAccounts', 'fundAccounts.fund_config','items.item', 'lands.landType', 'crops.seed']), function (Grid $grid) {
             $helper = new GridHelper($grid, $this);
             $grid->model()->where('id','>',10000);
             // 基础列
@@ -105,7 +105,9 @@ class UserController extends AdminController
 
                 $accounts = [];
                 foreach ($fundAccounts as $account) {
-                    $fundName = $account->fund_id == 1 ? '可用' : '冻结';
+
+//                    dd($account->fund_config);
+                    $fundName = $account->fund_config->name;
                     $balance = number_format($account->balance);
                     $accounts[] = '<span class="badge badge-primary">' . $fundName . ': ' . $balance . '</span>';
                 }