PHP把科學計數格式轉化爲數字字符串,PHP用字段varchar類型進行比較排序

前言:在寫API接口的時候,小遊戲前端傳過來的數據是科學計數法字符格式的,如1.2345678987654321e+30,此時後臺處理得到數據需要進行比較排序。

1.強制性的用字段爲varchar類型進行比較排序

'CAST(`cashnum_week` AS UNSIGNED)
$list = $wx_user->field('id,user_name,head_img,cashnum_week')
            ->where(['status'=>1])
            ->order('CAST(`cashnum_week` AS UNSIGNED) DESC')
            ->select();

直接將字段cashnum_week 轉變爲無符號化,此時再來進行排序

2.科學計數格式轉化爲字符串

將一個科學計數格式的數:1.2345678987654321e+30 轉化爲字符串‘123456789876543210000000000000’

首先將變量進行拆分在重組得到結果

實現原理:(1)將1.2345678987654321e+30拆分爲1.2345678987654321和+30

                  (2)在用1.2345678987654321乘以10的30次方,10的30次方用php函數pow(10,30)來得出。

a.第一種方法,從最普通的想法來

public function sctonum($num){
    if(false !== stripos($num, "e")){
        $a = explode("e",strtolower($num));
        $b = $a[0] * pow(10,$a[1]);
        return $b;
    }else{
        return $num;
   }
}
 

 b.用循環來得出


public function numToStr($num)
{
	$result = "";
	if (stripos($num, 'e') === false) {
		return $num;
	}
	while ($num > 0) {
		$v = $num - floor($num / 10) * 10;
		$num = floor($num / 10);
		$result = $v . $result;
	}
	return $result;
}

c.全部用php函數來得出

public function sctonum($num, $double = 5){
    if(false !== stripos($num, "e")){
        $a = explode("e",strtolower($num));
        return bcmul($a[0], bcpow(10, $a[1], $double), $double);
    }else{
        return $num;
    }
}
//注$double 是小數位數,可默認設置爲沒有

總結及建議:一萬個人眼裏一萬個哈利波特!每個結果可以由不同的過程來實現,首先用你自己最順手的,然後再來優化,其次借鑑能理解又高效規範的方法,比如c,簡潔高效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章