自由的货币政策

时间:2011-08-01 01:54:49

标签: php regex

我正在开发一个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”,但不考虑货币符号。如何调整此值以允许使用货币符号?

谢谢!

编辑:根据下面的评论,看起来我的正则表达式将允许太多的小数。你能帮我解决一下这个问题吗?

2 个答案:

答案 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不匹配)。