我正在开发一个PHP应用程序。我需要验证字符串是否可用作货币值。我希望以下内容验证:
$5.00
5
5.00
£5.00
我希望模式足够自由以接受合理的字符串。我也希望它接受货币符号;但是,要验证货币,它可以是任何字符或字符,因为我最终将值存储为两位小数浮点数。因此,当存储在数据库中时,“$ 5.00”或“USD 5.00”将变为“5.00”。我目前正在使用以下内容:
preg_match('/^[0-9]*\.?[0-9]+$/',$value)
适用于“5”或“5.00”,但不考虑货币符号。如何调整此值以允许使用货币符号?
谢谢!
编辑:根据下面的评论,看起来我的正则表达式将允许太多的小数。你能帮我解决一下这个问题吗?
答案 0 :(得分:3)
要允许所有货币符号,您需要使用Unicode Character Properties
\p{Sc}
或\p{Currency_Symbol}
:任何货币符号。
试试这个:
$value=preg_replace('/^(\p{Sc}?\d*)((\.|,)\d\d\d)?\d*$/u','$1$2',$value);
但是如果你期望输入的数字,那么用户可以从可选择的列表中指定货币的form会更好,并且只关注用户是否只会引入数字,这就是PAYPAL的方式确实
答案 1 :(得分:1)
正则表达式怪异如下:
/^(?<currency_left>\p{Sc}|[A-Z]{3})?\s*
(?<amount>(?:(?!,)[,\d]*)(?:(?=.\d)|(?<=\d))(?:\.\d*)?)\s*
(?<currency_right>(?(currency_left)|(?:\p{Sc}|[A-Z]{3})))?$/ui
(\ p {Sc}匹配任何货币符号。)
这将匹配可选的3位数货币符号或代码,后跟正数,后跟货币符号或3位数代码。该数字可能包括小数或小数点前的逗号。货币符号可以出现在数字之前或之后,但不能同时出现在两者之间。组Amount存储小数部分,currency_left和currency_right存储货币部分(currency_left和currency_right不匹配)。