【问题标题】:What sign for decimal separator uses PHP by default and can it be configured?小数分隔符的什么符号默认使用PHP,可以配置吗?
【发布时间】:2016-07-11 09:35:49
【问题描述】:

我正在使用number_format 以不同格式显示十进制数字(价格,根据区域配置等)。我更喜欢money_format。在任何情况下,number_format 都用于显示文本数量,因此,例如,我将为美国显示$1,203.56,为欧洲显示1.090,00€。当然,物品价格总和等的内部计算,我使用number_format来四舍五入价格,折扣等。我使用

number_format($price * quantity- $discounts ... , 2, ".", "");

我知道这是正确的,并且将完美地添加所有值,并且最终结果中的小数点后两位不得超过。我将其存储在数据库中,然后在导航器屏幕中显示每个案例的number_format 版本(文本)。但我担心在我的服务器中,他们可能会更改配置,突然 PHP 会使用 , 作为小数分隔符,混合计算的数量?这是可能的还是保证. 的科学记数法作为小数点并且在数字计算中不会使用千位分隔符?我很担心,因为 PHP 没有键入,所以number_format 的“类型”是字符串。我还必须投到(float) 吗?我所做的测试还可以,但我担心可能会出现问题。

【问题讨论】:

  • 不要使用number_format 对数字进行四舍五入。 number_format 用于格式化数字以用于文本表示,而不是用于进一步计算。
  • 将数字存储为数据库中的数字,仅当您显示这些数字时,使用 number_format
  • 问题是我必须将部分数量四舍五入到小数点后 2 位,精确到最接近的数字,就像 number_format 一样。例如,如果我得到 25.69 的价格并应用 21% 的折扣,我得到 5.3949。我需要准确地存储和应用 5.39 的折扣,并且我需要丢弃第三个小数点和后续小数点。这是强制性的。我可以使用其他PHP函数如round、floor、ceil等吗?
  • 是的,当然你可以使用round()floor()ceil()等常规函数,你的代码中有什么让你觉得你不能用的吗?
  • 不,我很狡猾地认为 round() 的舍入行为不是我想要的,但是 number_format 做到了,所以我使用了参数 number_format:浮点数,“。”, “”,一切都在计算中。但是后来因为返回值是一个字符串,所以它不安全,并且可能会更改配置,这可能是危险的。当然,由于 PHP 是松散类型的,因此返回值的类型无关紧要。我现在用round 更改了这些实例,一切都完全一样,但我更有信心了。

标签: php point decimal-point


【解决方案1】:

你的担心是对的,这就是为什么你应该将数字以原始的 numeric 格式存储在存储中,而不是作为格式化的字符串。应该对数值执行计算,而不是从逆向工程字符串表示中获得的值。

因此,将数字存储在 DECIMAL 中(或者,将值以美分为单位存储在 INT 列中更好),然后在视图中格式化数字。

<?php echo '$'.number_format($price); ?>

【讨论】:

  • 关于存储小数点整数格式的好建议,因为没有除法,所有内容都将具有有限的小数位数,因此我可以在一个字段中存储整数,在另一个字段中存储整数字段小数点的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2018-07-14
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多