514sid / num
v2.1.0
2023-11-25 10:48 UTC
Requires
- php: ^8.1
Requires (Dev)
- orchestra/testbench: ^8.8
- phpunit/phpunit: ^10.1
README
一个用于从字符串中解析数字的准确PHP辅助工具,支持各种千位分隔符和小数分隔符。
需求
安装
$ 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, ];