我正在尝试编写一个函数,用于验证给定字符串是否为有效数字。我知道我可以使用PHP is_numeric(),但要求是函数需要在以下情况下将逗号识别为有效:
例如: 它应该承认:1,000,230不,021,201或1,023,12 它还应该识别它前面的正面和负面以及美元符号。
我正在考虑使用preg_match检查数字格式,但我不熟悉preg_match。你能帮帮我吗?任何提示表示赞赏!谢谢!
答案 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);
}
上查看它
答案 2 :(得分:1)
Intl库的NumberFormatter对您来说足够了。
注意::您可能需要安装或启用 Int 库扩展名才能使用NumberFormatter
类。
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.
等点的整数但可以随意编辑如果它不是你想要的那个模式。