gugglegum / number-parser
1.0.0
2023-03-11 02:35 UTC
Requires
- php: >=8.0
Requires (Dev)
README
此包只做一件非常简单的事情:将包含十进制数字的字符串转换为数字(整数或浮点数)。但它通过检查原始字符串中的数字是否有效,如果出现问题则抛出异常来实现。
它有什么用呢?
PHP中有许多方法可以将字符串转换为数字。要将整数转换为数字,可以使用
$i = (int) $str; $i = intval($str);
对于分数,可以使用
$f = (float) $str; $f = floatval($str);
但是,这些方法的缺点是,即使字符串根本不是数字,它们也会继续工作。例如
var_dump(intval('a')); // prints int(0) var_dump(intval(new stdClass())); // prints int(1) (although with a PHP Warning "Object of class stdClass could not be converted to int")
在错误敏感的项目中,错误经常导致金钱损失,您可能希望对所有输入数据进行最严格的验证。在这种情况下,您可能想尝试使用标准方法
$n = filter_var($str, FILTER_VALIDATE_INT); $n = filter_var($str, FILTER_VALIDATE_FLOAT);
现在,如果 $str
包含除了数字之外的内容(例如,"123a"
),则 $n
将包含 FALSE
。但是,如果您正在构建围绕异常的错误处理逻辑,则需要添加如下代码
if ($n === false) { throw new Exception("Invalid number in string"); }
现在想象一下,您需要在多个地方做这件事!然而,虽然 filter_var()
很好并且有很多选项,但它的验证器有时不够严格。例如,filter_var()
允许数字前后有空格(例如," 123 "
),允许在零之前有负号(例如,"-0"
)。此外,您可能并不总是希望以指数形式看到输入的数字(例如,"1.234e-4"
)。
如何使用它?
非常简单
composer require gugglegum/number-parser
use \gugglegum\NumberParser\NumberParser; try { ... $i = NumberParser::parseInt($str1); $f = NumberParser::parseFloat($str2); $e = NumberParser::parseFloatExponent($str3); ... } catch (Exception $e) { echo "Error: {$e->getMessage()}\n"; }
将这种方法应用于从外部获取的所有数值数据是有意义的:$_SERVER['argv']
、$_GET
、$_POST
、$_COOKIE
、$_ENV
、fgets()
等。
有效数字的示例
整数
"1"
"-12345"
"1234567890"
分数(浮点数)
"0.1"
"0.10"
".1"
"1.23"
带有指数的分数
"1e2"
"1e+2""
"1e-2"
"1.23e2"
"12.3e1"
"0.1e2"
".123e-2"
无效数字的示例
整数
"a567"
"567a"
" 567"
"567 "
"56_7"
"-0"
"00"
"-00"
"01"
"+1"
".1"
"1e2"
""
分数(浮点数)
"a56.7"
"56.7a"
" 56.7"
"56.7 "
"5_6.7"
"00"
"00.0"
"0"
"-0.0"
"-.0"
"+1.2"
"."
""
带有指数的分数
"e",
"1e",
"1e+",
"1e-",
"e+2",
"e-2",
".e2",
如何运行测试?
composer intall
vendor/bin/phpunit