PHP将用户友好的格式化价格处理为标准浮动

PHP将用户友好的格式化价格处理为标准浮动,php,floating-point,usability,currency,number-formatting,Php,Floating Point,Usability,Currency,Number Formatting,我有一个表单,用户可以在其中输入商品的价格。理想情况下,我希望用户能够以他们觉得最好的任何方式添加价格,同时也为了可读性。然后我需要将其转换为标准浮动,以便我的web服务可以计算成本等 我正在努力解决的部分是如何获取货币的初始sting/float/int并将其转换为float 例如: UK: 1,234.00 FRA: 1 234,00 RANDOM: 1234 RANDOM2: 1234.00 所有这些都有稍微不同的格式 我希望将其存储为: 1234.00 然后,我将结果以十进制形式存储

我有一个表单,用户可以在其中输入商品的价格。理想情况下,我希望用户能够以他们觉得最好的任何方式添加价格,同时也为了可读性。然后我需要将其转换为标准浮动,以便我的web服务可以计算成本等

我正在努力解决的部分是如何获取货币的初始sting/float/int并将其转换为float

例如:

UK: 1,234.00
FRA: 1 234,00
RANDOM: 1234
RANDOM2: 1234.00
所有这些都有稍微不同的格式

我希望将其存储为:

1234.00
然后,我将结果以十进制形式存储在MySQL数据库中


任何帮助都会很好。

假设您使用的是MySQL,那么使用DECIMAL或NUMERIC类型是存储货币的正确类型

浮点易受舍入误差影响,精度有限

显示的格式应该由PHP处理


如果存储在DB中,当然应该存储一个货币代码-在检索时可以使用该代码告诉PHP如何显示它

假设您使用的是MySQL,那么使用十进制或数字类型是存储货币的正确类型

浮点易受舍入误差影响,精度有限

显示的格式应该由PHP处理

如果存储在DB中,您当然应该存储一个货币代码-在检索时可以使用它来告诉PHP如何显示它

您不能使用:

floatval($AnyVar)
你不能使用:

floatval($AnyVar)

在一个你想要接受如此多不同格式的情况下,把它弄对有点棘手

现在,我们可以使用一个简单的正则表达式来获取值的小数部分和完整部分:

/^([0-9,. ]+?)(?:[.,](\d{1,2})$|$)/
正则表达式将捕获数字的完整部分+小数部分,用a或a分隔。其中有一个或两个数字

捕获组1包含完整部分,组2包含小数部分(如果有)

要获取数字,只需从完整部分中过滤掉所有非数字字符,并将过滤后的完整部分和小数部分合并在一起


如果你想让它更简单,你可能应该在客户端实现一些东西来引导用户以正确的格式输入值。

如果你想接受如此多不同的格式,那么要正确地输入值就有点困难了

现在,我们可以使用一个简单的正则表达式来获取值的小数部分和完整部分:

/^([0-9,. ]+?)(?:[.,](\d{1,2})$|$)/
正则表达式将捕获数字的完整部分+小数部分,用a或a分隔。其中有一个或两个数字

捕获组1包含完整部分,组2包含小数部分(如果有)

要获取数字,只需从完整部分中过滤掉所有非数字字符,并将过滤后的完整部分和小数部分合并在一起



如果你想让它更简单,你可能应该在客户端实现一些东西来引导用户以正确的格式输入值。

我同意Brian的观点。让MySQL来处理货币问题。是的,我将使用十进制作为存储部分。这并没有回答我关于用PHP解构格式的问题。如果您通过从右边获取第三个字符来检查哪种格式是正确的呢?如果是“”,则删除所有“”。如果是“.”,那么删除所有“,”。我同意布赖恩的观点。让MySQL来处理货币问题。是的,我将使用十进制作为存储部分。这并没有回答我关于用PHP解构格式的问题。如果您通过从右边获取第三个字符来检查哪种格式是正确的呢?如果是“”,则删除所有“”。如果它是一个“.”,那么删除所有“,”。我曾想过这样做。。。但这似乎有点限制了用户。我假设大多数人都不会读取预期的格式,即使它非常明显。@diggersworld我稍微更改了正则表达式,它将匹配没有小数部分的数字,并且现在将小数部分与单个数字匹配。如果你想的话,通过进一步的调整,你也可以让它与其他类型的东西匹配。我曾经想过这样做。。。但这似乎有点限制了用户。我假设大多数人都不会读取预期的格式,即使它非常明显。@diggersworld我稍微更改了正则表达式,它将匹配没有小数部分的数字,并且现在将小数部分与单个数字匹配。如果需要,通过进一步调整,您可能还可以使其与其他类型的内容匹配。floatval()在字符串中包含逗号的情况下似乎不起作用,例如1234.00(英国格式),您可以使用str_替换删除所有逗号,然后使用floatval。如果我在法语格式上对逗号进行str_替换。。。数字将从1234,00(1234.00)变为123400(123400.00),因此仍然没有帮助。我决定忽略法国的定价符号。。。只需索取英国/美国格式的价格。所以基本上现在我用str_replace()删除逗号,然后用floatval()检查它是否是浮点。floatval()在字符串中有逗号的情况下似乎不起作用,即1234.00(英国格式),你可以用str_replace删除所有逗号,然后用floatval。如果我用str_replace替换了法语格式的逗号。。。数字将从1234,00(1234.00)变为123400(123400.00),因此仍然没有帮助。我决定忽略法国的定价符号。。。只需索取英国/美国格式的价格。所以基本上现在我用str_replace()删除逗号,然后用floatval()检查它是否是一个浮点。我目前无法测试它,因此给出了注释。也许您可以使用循环使用货币格式字符的有效组合,并将它们插入到合适的正则表达式中。您必须尝试使用和不使用数千个分隔符。我目前无法测试这一点,因此发表了评论。也许您可以使用循环使用货币格式字符的有效组合,并将它们插入到合适的正则表达式中。你得试试机智