Carol.Kar
Carol.Kar

Reputation: 5355

Format number to K/M/B within blade template

I am using laravel 5.7.19.

Within my TableController.php controller I query data from my db and hand it over to the view:

public function index()
{

    $c = DB::table('tick_data')
        ->select('*')
        ->join('basis', 'basis.Id', '=', 'tick_data.b_id')
        ->whereRaw('tick_data.id IN( SELECT MAX(tick_data.id) FROM tick_data GROUP BY tick_data.exchange_timestamp)')
        ->get();

    return view('datatable')->with('coins', $c);
}

Within my table.blade.php file I am putting the data out:

                    @foreach ($coins as $key=>$c)
                        <tr>
                            <td>{{ ++$key }}</td>
                            <td>{{ $c->pair }}</td>
                            <td>{{ number_format($c->last_price, 8) }}</td>
                            <td>{{ number_format($c->price_change_percentage, 8) }}</td>
                            <td>{{ number_format($c->price_change, 8) }}</td>
                            <td>{{ number_format($c->high_price, 8) }}</td>
                            <td>{{ number_format($c->low_price, 8) }}</td>
                            <td>{{ $c->base_volume }}</td>
                            <td>{{ $c->name }}</td>
                        </tr>
                    @endforeach

As you can see I am mainly using the number_format() function for formatting my values.

However, base_volume comes in the form of 467703.0000000000 or 10831.13202978000 and I would like to change it to the shortform with K,M,B.

Is there any function in blade that can do this? What is a good way to preformat the numbers?

Appreciate your replies!

Upvotes: 2

Views: 1598

Answers (1)

Mozammil
Mozammil

Reputation: 8750

I don't know any blade functions that can do this. However, you can use the PHP Humanizer package for this. For example, from their documentation:

use Coduo\PHPHumanizer\NumberHumanizer;

NumberHumanizer::metricSuffix(-1); // "-1"
NumberHumanizer::metricSuffix(0); // "0"
NumberHumanizer::metricSuffix(1); // "1"
NumberHumanizer::metricSuffix(101); // "101"
NumberHumanizer::metricSuffix(1000); // "1k"
NumberHumanizer::metricSuffix(1240); // "1.2k"
NumberHumanizer::metricSuffix(1240000); // "1.24M"
NumberHumanizer::metricSuffix(3500000); // "3.5M"

The good thing about the package is, it also supports multiple locales.

Edit: There are also other alternative solutions as discussed here. This could be a better option for you if you just need to shorten numbers.

Upvotes: 3

Related Questions