【问题标题】:PHP processing user-friendly formatted prices to standard floatsPHP 将用户友好的格式化价格处理为标准浮点数
【发布时间】:2011-10-12 17:09:20
【问题描述】:

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

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

例如:

UK: 1,234.00
FRA: 1 234,00
RANDOM: 1234
RANDOM2: 1234.00

所有这些格式都略有不同。

我想存储为:

1234.00

然后我会将结果作为 DECIMAL 存储在 MySQL 数据库中。

任何帮助都会很棒。

【问题讨论】:

  • 我目前无法对此进行测试,因此发表了评论。也许您可以使用localeconv 循环浏览货币​​格式字符的有效组合,并将它们插入合适的正则表达式。您必须尝试使用​​和不使用千位分隔符。

标签: php floating-point usability currency number-formatting


【解决方案1】:

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

浮点数容易出现舍入误差并且精度有限。

显示的格式应该由 PHP 处理。

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

【讨论】:

  • 我同意布赖恩的观点。让 MySQL 处理货币问题。
  • 是的,我将使用十进制作为存储部分。
  • 这并没有回答我的问题,虽然这是关于使用 PHP 解构格式。
  • 如果您通过获取右边的第三个字符来检查格式是什么?如果是',',则删除所有'.'。如果是'.'然后删除所有','。
【解决方案2】:

你不能使用:

floatval($AnyVar)

【讨论】:

  • floatval() 在字符串中有逗号的情况下似乎不起作用,即 1,234.00(英国格式)
  • 您可以使用 str_replace 删除所有逗号,然后使用 floatval。
  • 如果我对法语格式的逗号进行了 str_replace... 数字将从 1 234,00 (1234.00) 变为 1 23400 (123400.00),这样仍然无济于事。
  • 我决定忽略法国的定价符号......而只要求英国/美国格式的价格。所以基本上现在我用 str_replace() 删除逗号,然后使用 floatval() 检查它是一个浮点数。
【解决方案3】:

如果您想接受这么多不同的格式,要正确处理它有点棘手。

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

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

正则表达式将捕获数字的完整部分 + 小数部分,用 a 或 a 分隔。并且有一个或两个数字。

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

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

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

【讨论】:

  • 我曾想过这样做......但它似乎对用户有点限制。我假设大多数人不会阅读预期的格式,即使它非常明显。
  • @diggersworld 我稍微更改了正则表达式,它现在将匹配没有小数部分的数字和带有单个数字的小数部分。如果你愿意,通过进一步调整,你可能也可以让它匹配其他类型的东西。
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2019-03-11
  • 2017-12-20
相关资源
最近更新 更多