【发布时间】:2011-02-13 03:38:27
【问题描述】:
如何检查输入的值是否为货币。最好通过正则表达式或php函数。
(1550.50、1500 或 100.75 等值)
【问题讨论】:
如何检查输入的值是否为货币。最好通过正则表达式或php函数。
(1550.50、1500 或 100.75 等值)
【问题讨论】:
我猜你真正想要的是一种从数字中区分任何数字的方法,这是有意义的作为货币价值。所以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
【讨论】:
\b 时不起作用。
基于上面 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 的回应,我不确定我会走到这一步。
【讨论】:
我用这个:
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");
注意:
此函数也接受负货币值,如果您不想接受它们,请删除您在 preg_match 开头找到的 -?
这个函数也返回TRUE 类似13.7(只有一位小数)的值,如果你希望小数点总是两位而不是将{1,2} 替换为{2}(但在执行此读取点之前3)
此函数返回TRUE 也为0000.78 之类的值(多个前导零),但通常需要这种函数来过滤表单提交的值,然后再将它们插入@ 类型的DB 字段987654330@。当在此类字段中插入时,MySQL 接受 0000.78 和 13.7 作为查询中的有效值,并自动将它们转换为 0.78 和 13.70
【讨论】:
我快速启动了一个函数来检查字符串或 int 是否是有效价格,如果不是,则转换它。最终输出始终是小数点后两位的字符串,例如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
【讨论】:
你不能确定。用户可能会想到鸡。您需要检查用户是否输入了浮点数。看看 preg_match: http://jp2.php.net/manual/en/function.preg-match.php
您还需要问自己是否要尝试使用用户输入的内容,或者是否要拒绝它并只接受确切的格式。
【讨论】: