PHP:验证给定字符串是有效数字

时间:2016-07-01 18:32:00

标签: php preg-match

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

  • 逗号占数字的整数部分
  • 每个逗号后面都有3个整数位数
  • 每个逗号左侧至少有一位数字
  • 逗号左侧不超过3个连续数字

例如: 它应该承认:1,000,230不,021,201或1,023,12 它还应该识别它前面的正面和负面以及美元符号。

我正在考虑使用preg_match检查数字格式,但我不熟悉preg_match。你能帮帮我吗?任何提示表示赞赏!谢谢!

4 个答案:

答案 0 :(得分:2)

不需要正则表达式。剥离逗号,然后使用number_format重新格式化。如果这与您的原始输入相符,那么您就会很好。

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

您可以通过为number_format()提供第二个参数来调整处理小数的方式。

答案 1 :(得分:1)

您可以使用此功能:

1 main street

测试代码:

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

eval.in

上查看它

答案 2 :(得分:1)

Intl库的NumberFormatter对您来说足够了。

The NumberFormatter class

NumberFormatter::parse

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

  • 要启用扩展,请检查您的php.ini文件(C:\xampp\php\php.ini)并搜索extension=intl。删除前置的;(如果存在)。重新启动Apache服务器并尝试一下。

此扩展名为bundled with PHP,自PHP版本5.3.0起。

/**
 * 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

答案 3 :(得分:0)

我会这样写:

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.等点的整数但可以随意编辑如果它不是你想要的那个模式。