作为输入,我想接受以下任何一项:“$ 12.33”,“14.92”,“$ 13”,“17”,“14.00001”。作为输出,我分别想要1233,1492,1300,1700和1400。这显然不像看起来那么容易:
<?php
$input = '$64.99'; // value is given via form submission
$dollars = str_replace('$', '', $input); // get rid of the dollar sign
$cents = (int)($dollars * 100) // multiply by 100 and truncate
echo $cents;
?>
这输出6498而不是6499。
我认为这与浮点值的不准确性有关,并且避免这些是我首先转换为整数美分的全部原因。我想我可以使用逻辑,比如“摆脱$符号,检查是否有小数点,如果是这样,检查填充到2之后有多少个字符,然后截断,然后删除句点,如果没有一个附加两个零并希望最好的“但是使用字符串操作似乎很荒谬。
当然,从表单中获取货币价值并将其作为美分存储在数据库中是一种常见的用例。当然有一种“合理”的做法。
右? .....对? :其中
答案 0 :(得分:26)
考虑使用BC Math扩展,它可以进行任意精度数学运算。特别是bcmul()
:
<?php
$input = '$64.99';
$dollars = str_replace('$', '', $input);
$cents = bcmul($dollars, 100);
echo $cents;
?>
输出:
6499
答案 1 :(得分:3)
(int)
上投射($dollars*100)
时会丢弃小数。我不确定为什么,但删除了int cast并将其修复。
答案 2 :(得分:3)
$input[] = "$12.33";
$input[] = "14.92";
$input[] = "$13";
$input[] = "17";
$input[] = "14.00001";
$input[] = "$64.99";
foreach($input as $number)
{
$dollars = str_replace('$', '', $number);
echo number_format((float)$dollars*100., 0, '.', '');
}
给出:
1233
1492
1300
1700
1400
6499
注意像“0.125美元”这样的角落案例。我不知道你想怎么处理这些。
答案 3 :(得分:2)
请勿将<video>
直接转换为float
将integer
转换为float
,然后将string
转换为string
。
integer
<?php
$input = '$64.99';
$dollars = str_replace('$', '', $input);
$cents = (int) ( (string) ( $dollars * 100 ) );
echo $cents;
?>
答案 4 :(得分:1)
删除美元符号,然后使用bcmul()进行乘法。
答案 5 :(得分:1)
$test[] = 123;
$test[] = 123.45;
$test[] = 123.00;
$test[] = 123.3210123;
$test[] = '123.3210123';
$test[] = '123,3210123';
$test[] = 0.3210;
$test[] = '00.023';
$test[] = 0.01;
$test[] = 1;
foreach($test as $value){
$amount = intval(
strval(floatval(
preg_replace("/[^0-9.]/", "", str_replace(',','.',$value))
) * 100));
echo $amount;
}
结果:
12300
12345
12300
12332
12332
12332
32
2
1
100
答案 6 :(得分:0)
出现问题是因为转换为 int 会执行截断而不是舍入。简单的解决方法:在转换前对数字进行四舍五入。
<?php
$input = '$64.99';
$dollars = str_replace('$', '', $input);
$cents = (int) round($dollars * 100);
echo $cents;
?>
输出:6499
更长的解释:
当PHP看到字符串“64.99”并将其转换为(双精度)浮点数时,浮点数的实际值为:
64.989999999999948840923025272786617279052734375
这是因为数字 64.99 不能完全表示为浮点数,而上述数字是最接近 64.99 的可能浮点数。然后,将其乘以 100(完全可以表示),结果变为:
6498.9999999999990905052982270717620849609375
如果你把它转换成一个整数,它会截断这个数字,因此你得到的不是你想要的整数 6498。但是,如果您先对浮点进行四舍五入,您会得到 6499 作为浮点数,然后将其转换为 int 会得到预期的整数。