我正在尝试编写一个函数,验证给定字符串是否为有效数字。我知道我可以使用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.
,但如果不是你想要的,请随意编辑模式。