514sid/num

数字

v2.1.0 2023-11-25 10:48 UTC

This package is auto-updated.

Last update: 2024-09-25 12:59:13 UTC


README

Latest Stable Version Total Downloads License Tests

一个用于从字符串中解析数字的准确PHP辅助工具,支持各种千位分隔符和小数分隔符。

Hero

需求

安装

$ composer require 514sid/num

功能

内置的PHP函数intval()floatval(),以及类型转换,可能无法始终正确处理基于区域标准的不同数值格式。

floatval("1 234 567.89")    // float(1)
intval("1,234.56")          // int(1)

使用Num辅助工具,您可以实现所需的功能。

您可以选择为int()float()方法提供小数分隔符。

或者,如果您不确定特定字符串表示的数值的确切分隔符,可以允许Num辅助工具做出合理的猜测。

use Num\Num;
use Num\Enums\DecimalSeparator;

Num::float('1,234,567.89', DecimalSeparator::POINT) // float(1234567.89)
Num::float('1.234.567,89', DecimalSeparator::COMMA) // float(1234567.89)
// or
Num::float('1,234,567.89')  // float(1234567.89)
Num::float('1.234.567,89')  // float(1234567.89)
Num::float(123)             // float(123.0)

Num::int('1,234,567.89')    // int(1234567)
Num::int('1.234.567,89')    // int(1234567)
Num::int(123.45)            // int(123)

Num::float('text')  // float(0.0)
Num::int('text')    // int(0)

Num::int('1.23e3')    	  // int(1230)
Num::float('-5.67e-4')    // float(-0.000567)

工作原理

当您将小数分隔符作为第二个参数传递给int()float()静态方法时,它们会从字符串中移除除数字和小数分隔符之外的所有内容,然后使用PHP的内置功能进行类型转换。

如果您没有指定小数分隔符,Num辅助工具将尝试使用DecimalSeparatorGuesser进行猜测,该猜测依赖于维基百科文章中的格式约定:https://en.wikipedia.org/wiki/Decimal_separator

我仍在改进DecimalSeparatorGuesser,所以它可能不是100%准确。

在大多数地区,对于小于100,000的数字,千位分隔符是基于1000的幂来使用的。

这意味着如果提供的字符串只有一个点或逗号,并且后面跟着3个数字,猜测器将把这个数字视为整数;否则,将视为浮点数。

use Num\Num;

Num::float('12.34567')  // float(12.34567)
Num::float('12.34')     // float(12.34)
Num::float('12.345')    // float(12345.0)
Num::float('1234,567')  // float(1234.567)

Laravel类型转换

use Num\Casts\NumInt;
use Num\Casts\NumFloat;

protected $casts = [
    'integer' => NumInt::class,
    'float'   => NumFloat::class,
];

许可证

MIT