2009-06-15 106 views
3

我在匹配英国货币的正则表达式后(即£13.00,£9,999.99和£12,333,333.02),但不允许负值( - £2.17)或零值(£0.00或0)。英国货币javascript的正则表达式

我试图自己创造一个,但我有一个正确的混乱!

任何帮助很好地收到。

谢谢!

回答

5

这会做到这一点(当然主要是...)

/^£?[1-9]{1,3}(,\d{3})*(\.\d{2})?$/ 

利用了^和$以确保没有否定或其它字符是在字符串中,并假定逗号将被使用。英镑符号和便士是可选的。

编辑:实现你说的非零所以替换[1-9]

更新第一\ d:它已经指出,上述将不匹配£0.01。下面的改进,但现在有一个复杂的水平,它可能更好地测试/ [1-9] /第一,然后上述 - 没有基准测试。

/^£?(([1-9]{1,3}(,\d{3})*(\.\d{2})?)|(0\.[1-9]\d)|(0\.0[1-9]))$/ 

简要说明:串的

  • 匹配开始,随后可选的 “£”
  • 接着匹配
    • 一个具有用于逗号潜在1>£量分离分组和可选便士
    • 或a <£1> =£0.10 amou NT
    • 或< =£0.09量
  • 接着匹配线的端

便士(零在上面)的多级分你需要增加了效率较低变得正则表达式。

+2

大约0.50?那不会匹配... – 2009-06-15 09:58:20

+0

@Tim - 看上去很好。纠正。 – annakata 2009-06-15 10:22:02

+0

辉煌。谢谢 - 这将花费我很多时间。 – Sniffer 2009-06-15 10:42:14

0

你可以只让两个通道:

/^£\d{1,3}(,\d{3})*(\.\d{2})?$/ 

验证格式,

/[1-9]/ 

,以确保至少有一个数字是非零。

这比一次传递效率低(谢谢,annakata,基准信息),但对于第一个实现,只是“说出你想要的”可以显着减少开发时间。

3

在Unix/Linux的,它并不总是能够在一个JavaScript文件中的 '£'​​ 标志的类型,所以我倾向于使用十六进制数,即:?

/^ \ XA3 \ d { 1,3}([,] \ d {3} | \ d)?*([。] \ d {1,2})?$/

这似乎照顾我遇到的英国货币金额表示的所有组合。