用于解析货币值的正则表达式

3

我需要在AS3中编写一个正则表达式,将Excel格式的货币值解析为数字:

例如: 正则表达式($35,600.00) = 35600

并检查它是否正确格式化(千位分隔符为“,”,小数点为“.”。货币符号可以是任何(不仅仅是$),可以位于开头或结尾。

所以我只需要从数字中去除每个非数字字符并检查其是否有效。

谢谢! 马丁

3个回答

8
你需要两个案例,一个用逗号作为分隔符,另一个用小数点分隔整数。
如果是整数,则删除逗号或小数点后的所有内容(取决于你的格式)。然后运行以下正则表达式:
这将删除所有非数字字符:
s/\D+//g;

如果您没有整数,您需要包含一个关于整数分隔符的例外:

小数分隔符:

 s/[^\d.]+//g

逗号分隔符:

 s/[^\d,]+//g

*免责声明:我只是在脑海中解析了这些正则表达式,因此我的语法可能略有偏差。


这也会处理,如果我有一个逗号作为千位分隔符和一个小数点作为小数分隔符? 不知何故,AS3不喜欢这个正则表达式格式。 - Martin
马丁,没有AS3正则表达式格式方面的经验,但是如果你删除开头和结尾(例如s/和//g+),那么就可以获取匹配结果。 - Chris Ballance
1
@Chris Ballance:是的,你的正则表达式语法有误,请查看我的修改。 - Alan Moore
这很好!有没有办法只保留3452345.3252345,这会保留所有小数,所以像“234.45美元”这样的东西会被“转换”为“234.45..”? - Rabbott

2
除去货币符号和空格,您可以使用以下表达式:
[1-9][0-9]{1,2}(,[0-9]{3})*(.[0-9]{2})+

( [1-9][0-9]{0,2} 一到三位数字,无前导零,后跟 (,[0-9]{3})* 千位分隔符和三位数,零次或多次, | 或者 0 前导零。 ) (.[0-9]{2})? 可选的小数点后跟正好两位数字。
妥善处理货币符号并不是最容易的事情,因为您必须避免前导和尾随的货币符号。 解决方案是使用向前查找断言。
(?=$(([$€] ?)?[0-9,.]+|[0-9,.]+( ?[$€]))^)[$€ ]+<ExpressionFromAbove>[$€ ]+
这样做如下:
(?= 正向前查找断言。 $ 锚定行首。 ( 开始选项。 ([$€] ?)? 可选的前导货币符号后跟可选的空格 [0-9,.]+ 一个或多个数字、千位分隔符和小数点 | 或者 [0-9,.]+ 一个或多个数字、千位分隔符和小数点 ( ?[$€]) 后跟可选的空格和货币符号。 ) 结束选项。 ^ 锚定行尾。 ) [$€ ]+ 前导货币符号和可选的空格。 <ExpressionFromAbove> 匹配实际数字。 [$€ ]+ 可选的尾随空格和货币符号。
如果您知道格式是正确的,请将所有不是数字或小数点的内容删除,并将其解析为十进制数(在 C# 中,这将使用 Decimal.Parse()),或者如果没有合适的解析方法,则仅拆分小数点,解析为两个整数,然后组合两个数字。

0
[$|£|<insert more pipe sepatared options here>]?(\d)*(,)?(\d)*.\d\d[$|£|<insert more pipe sepatared options here>]?

可能有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接