Kk源码:实现千位(k kk)解释器(kk ok kk m)

关于Kk源码的问题,在kk ok kk m中经常遇到,Problem

Problem

我试图创建一个工具,将一个数字作为输入,例如-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 问题,但我想解决方案应该或多或少类似于其他语言,算法本身应该不是很困难。

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字符数。然后,您可以使用ks 的数量作为数字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)
Win10配置:如何配置win10使用ODBC驱动
上一篇
如何把sql文件导入数据库:将.bak文件导入SQL Server中的数据库
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(34条)