Problem
我试图创建一个工具,将一个数字作为输入,例如-1kk
,并将每个k
替换为乘以 1000,即这里我们得到1000000
。
处理整数时没有问题,但我正在努力实现和算法,它将用浮点替换数字,如12.345kk
与12345000
。
可能的解决方案
好的,我可以将每个k
替换为乘以 1000,然后eval
整个表达式:
$inp= "12.345kk";
$number = preg_replace('/[kt]/','*1000',$inp);
eval("\$result = {$number};");
echo($result); // 12345000
但它真的危险,因为该工具需要用户输入,用户可以写任何他们想要的。
您能为这个问题提供一个安全的解决方案吗?
这是一个 PHP 问题,但我想解决方案应该或多或少类似于其他语言,算法本身应该不是很困难。
4
您可以使用preg_match
将输入拆分为数字和乘数,并将数字乘以1000
到乘数字符串的长度:
$inp= "12.345kk";
$number = 0;
if (preg_match('/^([\d.]+)([kt]+)/', $inp, $matches)) {
$number = $matches[1];
$multipliers = $matches[2];
$number *= 1000 ** strlen($multipliers);
}
echo $number;
输出:
12345000
Demo on 3v4l.org
1
如果你确定你的数字的格式,你可以在你的字符串中计算k
字符,然后将其转换为数字并乘以适当的功率。
$inp= "12.345kk";
$count = substr_count($inp,'k');
$number = (double)$inp*1000**$count;
print($number);
1
你的担忧是有保证的,你不应该通过eval()
运行用户输入,除非你绝对必须这样做。你不必在这里这样做。让我告诉你一个可能的解决方案。
您可以通过casting it to float
获得输入的数字部分。您可以通过使用substr_count()
获得k
字符数。然后,您可以使用k
s 的数量作为数字1000
的指数,然后将其与输入数字相乘:
$inp = "12.345kk";
$number = (float) $inp; // 12.345
$factor = pow(1000, substr_count($inp, 'k')); // 1000^2
$result = $number * $factor; // 12345000
请注意,您也可以使用**
operator而不是pow
。但是,我认为不熟悉 PHP 的程序员很容易理解pow
,因此更可取。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(34条)