问题
我想创建一个工具,将一个数字作为输入,例如------。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的问题,但我想在其他语言中的解决方法应该是差不多的,一个算法本身应该不是很困难。
如果你确定你的数字的格式,你可以算出你的数字。k
字符串中的字符,然后将其投射到数字上,并乘以适当的幂。
$inp= "12.345kk";
$count = substr_count($inp,'k');
$number = (double)$inp*1000**$count;
print($number);
你可以使用 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
你的担心是有道理的,你不应该让用户的输入通过 eval()
除非你非得这样做 你不必在这里这样做。让我给你看一个可能的解决方案。
你可以通过以下方法获得输入的数字部分。抛给 float
. 你可以得到的数量 k
字符,用 substr_count()
. 然后,您可以通过使用的数量来计算结果的数量。k
s为指数 1000
并将其与输入的数字相乘。
$inp = "12.345kk";
$number = (float) $inp; // 12.345
$factor = pow(1000, substr_count($inp, 'k')); // 1000^2
$result = $number * $factor; // 12345000
注意,你也可以使用 **
经营者 而不是 pow
. 但是,我认为 pow
对不熟悉PHP的程序员来说,会很容易理解,因此最好是这样。