如何检查输入的值是否为货币。最好使用正则表达式或php函数。
(1550.50
,1500
或100.75
)
答案 0 :(得分:48)
我猜你真正想要的是一种方法,可以将数字中的任何号码告诉作为货币值。因此1.04e-7
可能不匹配,1.234
或12.3
也不应该匹配,即使所有这些都是数字。
最后,您必须要求1,234.56
之类的千位分隔符(与小数点一样,也可能在区域设置之间有所不同)。因此,假设您只想使用点作为小数分隔符来检查货币值,并将逗号作为可选的千位分隔符,请尝试以下操作:
/\b\d{1,3}(?:,?\d{3})*(?:\.\d{2})?\b/
<强>解释强>
\b # word boundary assertion
\d{1,3} # 1-3 digits
(?: # followed by this group...
,? # an optional comma
\d{3} # exactly three digits
)* # ...any number of times
(?: # followed by this group...
\. # a literal dot
\d{2} # exactly two digits
)? # ...zero or one times
\b # word boundary assertion
答案 1 :(得分:23)
我用这个:
function isCurrency($number)
{
return preg_match("/^-?[0-9]+(?:\.[0-9]{1,2})?$/", $number);
}
//usage examples
echo (isCurrency("10.36") ? "TRUE" : "FALSE");
echo (isCurrency(10.3) ? "TRUE" : "FALSE");
谨防:
此功能也接受负货币值,如果您不想接受它们,请删除您在-?
此函数还返回TRUE
等值,例如13.7
(只有一个小数),如果您希望小数始终为2而不是{1,2}
替换为{2}
(但在此之前执行此读取点3)
此函数也会返回TRUE
这样的值,例如0000.78
(多个前导零),但通常需要这种函数来过滤表单提交的值,然后再将它们插入到数据库中DECIMAL(n.2)
类型的字段。在这些类型的字段中插入时,MySQL会同时接受0000.78
和13.7
作为查询中的有效值,并自动将它们转换为0.78
和13.70
答案 2 :(得分:1)
你不能确定。用户可能会想到鸡。您需要检查用户是否输入了浮动。看看preg_match: http://jp2.php.net/manual/en/function.preg-match.php
您还需要问自己是否要尝试使用用户输入的内容,或者是否要拒绝它并且只接受确切的格式。
答案 3 :(得分:0)
基于上面的Tim Pietzcker的一个很好的答案,我创建了:
/* Sample usage:
* ============
* echo '<ol>';
* echo '<li>', (isCurrency('10.36') ? "TRUE" : "FALSE"), '</li>'; // 1 - TRUE
* echo '<li>', (isCurrency('10.3') ? "TRUE" : "FALSE"), '</li>'; // 2 - TRUE
* echo '<li>', (isCurrency('10.') ? "TRUE" : "FALSE"), '</li>'; // 3 - TRUE
* echo '<li>', (isCurrency('10') ? "TRUE" : "FALSE"), '</li>'; // 4 - TRUE
* echo '<li>', (isCurrency('1,088,888,888,888') ? "TRUE" : "FALSE"), '</li>'; // 5 - TRUE
* echo '<li>', (isCurrency('1,088888,888,888') ? "TRUE" : "FALSE"), '</li>'; // 6 - I'm not sure if this should return TRUE or FALSE. For now going with TRUE as we can still interpret the desired value regardless whether the commas are correct.
* echo '<li>', (isCurrency('$10') ? "TRUE" : "FALSE"), '</li>'; // 7 - TRUE
* echo '<li>', (isCurrency('-10') ? "TRUE" : "FALSE"), '</li>'; // 8 - TRUE
* echo '<li>', (isCurrency('$-10') ? "TRUE" : "FALSE"), '</li>'; // 9 - TRUE
* echo '<li>', (isCurrency('-$10') ? "TRUE" : "FALSE"), '</li>'; // 10 - TRUE
* echo '<li>', (isCurrency('--$10') ? "TRUE" : "FALSE"), '</li>'; // 11 - FALSE
* echo '<li>', (isCurrency('-$$10') ? "TRUE" : "FALSE"), '</li>'; // 12 - FALSE
* echo '<li>', (isCurrency('10x') ? "TRUE" : "FALSE"), '</li>'; // 13 - FALSE
* echo '<li>', (isCurrency('x10') ? "TRUE" : "FALSE"), '</li>'; // 14 - FALSE
* echo '</ol>'; */
function isCurrency (string $currencyToTest): bool
{
$regExpPattern = '/^[$-]{0,2}\d{1,3}(?:,?\d{3})*(?:\.\d{0,2})?$/';
/* $regExpPattern explanation
/^ # string must begin with
[$-](0,2) # optional $ and/or -
\d{1,3} # 1-3 digits
(?: # followed by this group...
,? # an optional comma
\d{3} # exactly three digits
)* # ...any number of times
(?: # followed by this group...
\. # a literal dot
\d{2} # exactly two digits
)? # ...zero or one times
$/ # must end with
*/
$currencyToTest = trim ($currencyToTest);
return preg_match ($regExpPattern, $currencyToTest);
}
已添加:
如果没有蒂姆·皮茨克(Tim Pietzcker)的回应,我不确定我会走这么远。
答案 4 :(得分:-1)
我迅速启动了一个函数,用于检查字符串或整数是否是有效价格,如果不是,则将其转换。最终输出将始终是小数点后两位的字符串,例如1000.00
。
它删除负号/负号,逗号,空格和美元符号。唯一的例外是,如果字符串包含字母之类的任何字符,这些字符会将is_numeric()
设置为false。
功能如下:
function convertToValidPrice($price) {
$price = str_replace(['-', ',', '$', ' '], '', $price);
if(!is_numeric($price)) {
$price = null;
} else {
if(strpos($price, '.') !== false) {
$dollarExplode = explode('.', $price);
$dollar = $dollarExplode[0];
$cents = $dollarExplode[1];
if(strlen($cents) === 0) {
$cents = '00';
} elseif(strlen($cents) === 1) {
$cents = $cents.'0';
} elseif(strlen($cents) > 2) {
$cents = substr($cents, 0, 2);
}
$price = $dollar.'.'.$cents;
} else {
$cents = '00';
$price = $price.'.'.$cents;
}
}
return $price;
}
这里是测试它:
var_dump(convertToValidPrice('100')); // 100.00
var_dump(convertToValidPrice('-100')); // 100.00
var_dump(convertToValidPrice(100)); // 100.00
var_dump(convertToValidPrice('$100')); // 100.00
var_dump(convertToValidPrice('100.98')); // 100.98
var_dump(convertToValidPrice('100.9')); // 100.90
var_dump(convertToValidPrice('100.')); // 100.00
var_dump(convertToValidPrice('1,00.98')); // 100.98
var_dump(convertToValidPrice('1,000.98')); // 1000.98
var_dump(convertToValidPrice('100.98829382')); // 100.98
var_dump(convertToValidPrice('abc')); // null