Introducing the Laravel Number Utility Class

CodeWithCaen - Nov 16 '23 - - Dev Community

Introduction

Hello everyone, Caen here! I'm excited to share with you a recent addition I made to the Laravel framework (PR #48845) that I believe will simplify your number formatting needs. I've introduced a new Number utility class called that provides several new helpers to format numbers.

As another bonus: the helpers are locale-aware, so you can format numbers according to the current locale, either globally, or on a per-method basis!

Background

In many applications, there's often a need to format numbers according to different requirements, such as displaying them as currency, percentages, or human-readable file sizes. Laravel didn't have a dedicated utility for this, so with the help of the community, I decided to create one. I've been working on this utility class for a a little while now, and am really excited that it was merged into the framework. Let's take a look at what it offers.

The Number Class

Introduction

All methods are part of the Illuminate\Support\Number class:

use Illuminate\Support\Number;
Enter fullscreen mode Exit fullscreen mode

General formatting

Using the format method, we can format a number according to the current locale.

Number::format(25) // 25
Number::format(100000) // 100,000
Number::format(123456789) // 123,456,789
Enter fullscreen mode Exit fullscreen mode

We can also specify a custom locale to format the number according to that locale's rules.

Number::format(123456789, 'en') // 123,456,789
Number::format(123456789, 'de') // 123.456.789
Number::format(123456789, 'sv') // 123 456 789
Enter fullscreen mode Exit fullscreen mode

Percentage formatting

The formatPercentage method formats a number as a percentage according to the current locale.

Number::toPercentage(25) // 25%
Number::toPercentage((1/3) * 100, precision: 2) // 33.33%
Enter fullscreen mode Exit fullscreen mode

Currency formatting

Here's another fun method used to format various currencies with locale support. Perfect for your webshops!

Number::toCurrency(10) // $10.00
Number::toCurrency(25, currency: 'EUR') // €25.00
Number::toCurrency(5.49, currency: 'EUR', locale: 'de') // 5.49 €
Enter fullscreen mode Exit fullscreen mode

File size formatting

Here is the toFileSize method which actually is the whole reason behind this utility class. I first submitted a PR to add a File::bytesToHuman() helper (PR #48827), which Taylor then suggested we add as part of a new Number class.

Number::toFileSize(1024); // 1 KB
Number::toFileSize(1600, precision: 2); // 1.56 KB
Number::toFileSize(1024 * 1024 * 1024 * 5); // 5 GB
Enter fullscreen mode Exit fullscreen mode

Human readable formatting

Next up is also a quite fun one for when you want something that's more readable than precise. It converts numbers to a human-readable string.

Number::forHumans(1000) // 1 thousand
Number::forHumans(12345) // 12 thousand
Number::forHumans(12345, precision: 3) // 12.345 thousand
Enter fullscreen mode Exit fullscreen mode

Setting the locale

We can set the locale globally using the setLocale method, for example in a service provider:

Number::setLocale('sv');
Enter fullscreen mode Exit fullscreen mode

You can also use the withLocale method which executes the given callback using the specified locale and then restores the original locale:

Number::withLocale('sv', function () {
    return Number::format(123456789);
});
Enter fullscreen mode Exit fullscreen mode

Conclusion

I hope this new addition makes your life a bit easier when dealing with number formatting in Laravel. Please free to check out the next Laravel update and incorporate this utility class into your projects. Happy coding!

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .