gpt4 book ai didi

php - 在数字上强制保留 4 个小数位而不将其类型更改为字符串

转载 作者:行者123 更新时间:2023-12-04 12:27:22 25 4
gpt4 key购买 nike

我在 post 请求中收到了一些数据,包括一个来自 api 的十进制数 content-type:json在发布的数据中,是Amount 4位小数的参数

{
"Amount": 500.0000 ,
"param1" : "value1" ,
"param2" : "value2"
}
解析json后
$data = json_decode(file_get_contents('php://input'), true);
var_dump($data);
这是我的输出
array(3) {
["Amount"]=>
float(500)
["param1"]=>
string(6) "value1"
["param2"]=>
string(6) "value2"
}
问题是如果金额为零,我会丢失金额的小数位
所以而不是 500.0000我收到 500 ,我知道它们在数学上是相同的数字,但我需要从这些发布的参数中生成一个哈希值,这要求我拥有 Amount作为一个带有 4 个小数位的浮点数,与第一次发布的完全一样
我可以做类似的事情
$data['Amount'] = sprintf('%0.4f',   $data['Amount'] );
但它会将 Amount 转换为字符串,从而导致无效的哈希值
array(3) {
["Amount"]=>
string(8) "500.0000"
["param1"]=>
string(6) "value1"
["param2"]=>
string(6) "value2"
}
我需要我的 $data 输出
  ["Amount"]=>
float(500.0000)
试图运行它抛出 floatval,再次丢失十进制零!
我对这么简单的事情失去了理智,知道如何解决这个问题吗?
- - - - - - - - 编辑 - - - - - - - - - -
这个散列的目的是验证请求的来源(确保它是我的提供者向我发送这些数据)
他们向我发送了 publicKey 请求,我应该使用一些参数生成哈希并将其与该公钥进行比较
为了创建哈希,我需要对一些接收到的参数进行 json_encode 并运行它们 throw sha256 ,最后我需要将它们与接收到的 public_key 进行比较
所以如果我收到
{
"Amount": 5000.0000,
"Token": "6789",
"OperatorId": 7799,
"TransactionId": 110883669553,
"PublicKey": "f7bb8448c5701b9530fbecc8f9d6296b2ce0600118c402213709bcf19f533c1b"
}
这就是我计算哈希的方式
$shared_key  =  'someKey';
$hash_params = [
'Amount' => $data['Amount'] ,
'TransactionId' => $data['TransactionId'] ,
];
$hash_string = json_encode($hash_params) . $shared_key ;
$hash = hash('sha256', $hash_string );
if($hash != $data['PublicKey'] )
{
die( "hash check failed");
}
在这种情况下,我需要 sha256 这个 $hash_string
{"WithdrawAmount":5000.0000,"TransactionId":12345 }someKey
如果它变成
{"WithdrawAmount":"5000.0000","TransactionId":12345 }someKey
它会给我一个错误的哈希值

最佳答案

我认为没有一种简单易行的方法来执行 json_encode , 当数字的小数部分为“0000”时,强制保留 4 个小数位的 Float 值,而不操作 json 字符串。json_enconde方法有 2 个预定义的常量,可以帮助我们“几乎”达到预期的结果,这些是 JSON_NUMERIC_CHECK and JSON_PRESERVE_ZERO_FRACTION但通常 0 被删除。

echo json_encode(["amount" => "5.0000"], JSON_NUMERIC_CHECK | JSON_PRESERVE_ZERO_FRACTION);
输出: {"amount":5.0}我的解决方案是使用唯一字符串作为数量值执行编码,然后使用 str_replace 替换它对于这样的格式化金额:
$amount_needle = "###amount###";
$hash_params = [
'Amount' => $amount_needle,
'TransactionId' => $data['TransactionId'],
];
$encoded_json = json_encode($hash_params);
$hash_string = str_replace("\"{$amount_needle}\"", sprintf('%0.4f', $data['Amount']), $encoded_json) . $shared_key ;

关于php - 在数字上强制保留 4 个小数位而不将其类型更改为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69639494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com