【问题标题】:A non well formed numeric value encountered - shopping cart basket遇到格式不正确的数值 - 购物车篮
【发布时间】:2019-01-13 18:21:23
【问题描述】:

当通知打开时,我有以下消息:

注意:遇到格式不正确的数值

https://i.stack.imgur.com/lcI4P.png

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
use App\Cart;
use App\orders;
use DB;
use Auth;
class CartController extends Controller
{
    public function add(){
        $id = request('id');
        $product = Product::find($id);
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->add($product, $product->id);
    request()->session()->put('cart', $cart);
    return response()->json($cart->totalQty);
}
// public function add22(){
//     $id = request('id');
//     $product = Product::find($id);
//     $oldCart = session()->has('cart2') ? session()->get('cart2') : null;
//     $cart = new Cart($oldCart);
//     $cart->add($product, $product->id);
//     request()->session()->put('cart2', $cart);
//     return response()->json($cart->totalQty);
// }
public function add2($id) 
{
    $product = Product::find($id);      
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->add($product, $product->id);
    request()->session()->put('cart', $cart);       
    // dd(session()->get('cart'));

    return back();
}
public function index(){
    if(session()->has('cart'))
    {
        $products = session()->get('cart')->items;
    }
    // elseif(session()->has('cart2'))
    // {
    //     $products = session()->get('cart2')->items;
    // }
    else
    {
        $products = 'nothing';
    }
    $currency = DB::table('currency')->get();
    return view('basket', compact('products', 'currency'));
}
public function order(){
    if(session()->has('cart'))
    {
        $products = session()->get('cart')->items;
    }
    // elseif(session()->has('cart2'))
    // {
    //     $products = session()->get('cart2')->items;
    // }
    else
    {
        $products = 'nothing';
    }
    $currency = DB::table('currency')->get();
    return view('order', compact('products', 'currency'));
    // return view('order');
}
public function store(Request $request){
    $this ->validate(request(), [
        'name'=>'required',
        'address'=>'required',
        'auth'=>'required',
    ]);
    if(Auth::check())
    {
    $orders = orders::create([
        'name' => $request['name'],
        'description' => $request['address'],
        'auth' => $request['auth'],
    ]);
    }
    $cart = session()->get('cart');
    $message = "Имя: ".request('name')."\nАдрес:".request('address')."\nЗаказанные товары:";
    foreach($cart->items as $product) {
        $message .= $product['item']['name']." * ".$product['qty'].", Цена - ".$product['item']['entityprice']*$product['qty']."\n";
    }
    $message .= "\nИтого: ".$cart->totalPrice." тг\n";
    $subject = "Заказ товара";     
    $headers = 'From: info@hansolomed.kz' . "\r\n" .
        'Reply-To: info@hansolome.kz' . "\r\n".
        'X-Mailer: PHP/' . phpversion();
    mail('015@i-marketing.kz', $subject, $message, $headers);
    request()->session()->forget('cart');
}    
public function remove($id){
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->removeItem($id);
    if(count($cart->items) > 0){
        session()->put('cart', $cart);
    }else{
        session()->forget('cart', $cart);
    }
    return redirect()->back();
}    
public function redis($id){
    $oldCart = session()->has('cart') ? session()->get('cart') : null;
    $cart = new Cart($oldCart);
    $cart->reduceByOne($id);
    session()->put('cart', $cart);
    return redirect()->back();        
}

}

【问题讨论】:

  • 我猜$product 包含字符串,而不是整数,因此 PHP 必须将它们转换为整数才能进行数学运算。转换会引发该通知。
  • @user3783243 只有当字符串不是数字时,转换才会引发通知。

标签: php laravel


【解决方案1】:

我认为 user3783243 是对的。使用 floatval() 或 intval(),然后你可以将它们相乘。

<?php echo e(number_format( floatval( session()->get(cart)->totalPrice, 0, ',',' ')* floatval($currency[0]->coefficient) ; ?>

【讨论】:

  • 这可能会掩盖通知但不能解决问题的根源,从而难以调试。这类似于@ 操作员的屏蔽通知。某处字符串似乎包含非数字值。想象一下它是'$50',它被处理为0
  • 我认为,内容只是错误的类型,“20”而不是 20。当然,floatval() 不是用于检查或清理错误的输入/值,例如“$50”。
【解决方案2】:

您正在使用不返回有效格式数字的number_format 字符串进行计算。

echo number_format(1000.95, 0, ',', ' ');

打印1 001

'1 001' * 2 抛出通知并计算 2 (1*2),而不是预期的 2001.90

您的格式意味着0 小数,, 作为小数点和空格作为千​​位分隔符组。仅使用数字格式输出,不要使用格式化数字计算。

你可能想要:

echo e(number_format( session()->get(cart)->totalPrice * $currency[0]->coefficient , 2, ',', '' ));

【讨论】:

    【解决方案3】:

    https://github.com/bumbummen99/LaravelShoppingcarthttps://github.com/Crinsane/LaravelShoppingcart 的分支项目,也支持最新的 Laravel 版本。

    有一个名为Cart::totalFloat() 的方法将返回购物车总数的浮动值。

    ############### 或#################

    对于这个包,只需将数字格式转换回整数或浮点值。下面是一个例子

    $num = '1,200,998.255';

    ########## 浮点值##########################

    echo filter_var($num, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

    #输出:1200998.255

    ########## 整数值###########################

    echo filter_var($num, FILTER_SANITIZE_NUMBER_INT);

    #输出:1200998

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多