preg match - PHP:验证给定的字符串是一个有效的数字


preg match - PHP: Validate a given string is a valid number

我正在尝试编写一个函数,验证给定字符串是否为有效数字。我知道我可以使用PHP的is_numeric(),但要求是函数需要在以下情况下识别逗号是有效的:

  • 逗号位于数字
  • 的整数部分。
  • 每个逗号后面有3个整数
  • 每个逗号左至少一个数字
  • 逗号左边不超过3个连续数字
例如

:它应该识别:1,000,230,而不是021,201或1,023,12它还应该识别正负和前面的美元符号。

我想使用preg_match来检查数字格式,但我不熟悉preg_match。你能帮我一下吗?任何提示都是感激的!

不需要正则表达式。去掉逗号,然后用number_format重新格式化。如果这与你的原始输入相匹配,那就很好了。

if (number_format(str_replace(',', '', $number)) === $number) {
   // pass
}

您可以通过向number_format()提供第二个参数来调整如何处理小数。

你可以使用这个函数:

function hasNumericFormat($str) {
    return preg_match("/^[-+]?[$]?([1-9]'d{0,2}(,'d{3})*|0)('.'d+)?$/", $str);
}

测试代码:

function test($str) {
    if (hasNumericFormat($str)) {
        echo "$str is OK<br>";
    } else {
        echo "$str violates numerical format<br>";
    }
}
test("-$1,234,567.89"); // ok
test(",123,567.89"); // not ok: digit missing before comma
test("1,123,56"); // not ok: not 3 digits in last group
test("-0,123,567"); // not ok: first digit is zero
test("+0"); // ok

Intl库的NumberFormatter可能对你足够了。

NumberFormatter类

NumberFormatter

::解析

注意:您可能需要安装或启用Int库扩展来使用NumberFormatter类。

  • 要启用扩展,检查php.ini文件(C:'xampp'php'php.ini)并搜索extension=intl。如果前面有;,请删除。重新启动Apache服务器,并给它一个尝试。

这个扩展是捆绑在PHP版本5.3.0的PHP。

/**
 * Parse a number.
 *
 * @param string $locale - The locale of the formatted number.
 * @param string $number - Formatted number.
 * @return mixed - The value of the parsed number or FALSE on error.
 */
function parse_number(string $number, $locale)
{
    return (new NumberFormatter($locale, NumberFormatter::DECIMAL))
        ->parse(trim($number));
}
echo parse_number('4.678.567.345,3827', 'de_DE'); // 4678567345.3827
echo parse_number('4.678567.345,3827', 'de_DE'); // FALSE
echo parse_number('4,678,567,345.3827', 'en_US'); // 4678567345.3827
echo parse_number(',678567,345.3827', 'en_US'); // FALSE

我将这样写:

if (preg_match('~'A(?>[1-9][0-9]{0,2}(?:,[0-9]{3})*|0)(?:'.[0-9]+)?'z~', $number)) {
    // true
} else {
    // false
}

细节:

~ # my favourite pattern delimiter
'A # start of the string
(?>  # group for integer part:
     # I made it atomic to fail faster when there aren't exactly 3 digits
     # between commas
    [1-9] [0-9]{0,2} # beginning doesn't start with a zero
    (?:,[0-9]{3})*   # zero or more 3 digits groups
  |                  # OR
    0                # zero alone
)
(?:  # optional group for decimals
    '.[0-9]+ # at least 1 digit
)?
'z # end of the string
~

请注意,我选择不允许像012这样的前导零的数字,没有整数部分的数字,如.12或带点的整数,如12.,但如果不是你想要的,请随意编辑模式。