gugglegum / number-parser

1.0.0 2023-03-11 02:35 UTC

This package is auto-updated.

Last update: 2024-09-11 05:38:33 UTC


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$_ENVfgets() 等。

有效数字的示例

整数

"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