实现千人(k,kk)解释器。

问题描述 投票:0回答:1

问题

我想创建一个工具,将一个数字作为输入,例如------。1kk,并取代每个 k 乘以1000,即这里我们得到 1000000.

在处理整数时没有问题,但我在努力实现一个算法,将数字替换为浮点,如 12.345kk12345000.


可能的解决办法

好吧,我可以把每个 k 再乘以1000 eval 整个表情。

$inp= "12.345kk";
$number = preg_replace('/[kt]/','*1000',$inp);
eval("\$result = {$number};");
echo($result); // 12345000

但其实 危险的 因为该工具需要用户输入,而用户可以写任何他们想写的东西。

你能不能提供一个安全的解决方案来解决这个问题?

这是一个PHP的问题,但我想在其他语言中的解决方法应该是差不多的,一个算法本身应该不是很困难。

php
1个回答
1
投票

如果你确定你的数字的格式,你可以算出你的数字。k 字符串中的字符,然后将其投射到数字上,并乘以适当的幂。

$inp= "12.345kk";

$count = substr_count($inp,'k');

$number = (double)$inp*1000**$count;

print($number);

3
投票

你可以使用 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

3v4l.org上的演示


1
投票

你的担心是有道理的,你不应该让用户的输入通过 eval()除非你非得这样做 你不必在这里这样做。让我给你看一个可能的解决方案。

你可以通过以下方法获得输入的数字部分。抛给 float. 你可以得到的数量 k 字符,用 substr_count(). 然后,您可以通过使用的数量来计算结果的数量。ks为指数 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的程序员来说,会很容易理解,因此最好是这样。

© www.soinside.com 2019 - 2024. All rights reserved.