实施数千(1k = 1000,1kk = 1000000)解释器

问题


我正在尝试创建一个将数字作为输入的工具,例如 - 1kk,并用k乘以 1000 替换每个数字,即在这里我们得到1000000。


处理整数时没有问题,但我正在努力实现将数字替换为浮点数的算法,例如12.345kkwith 12345000。


可能的解决方案


k好的,我可以用乘以 1000 的方法替换每个表达式,然后eval是整个表达式:


$inp= "12.345kk";

$number = preg_replace('/[kt]/','*1000',$inp);

eval("\$result = {$number};");

echo($result); // 12345000

但这真的很危险,因为该工具需要用户输入,并且用户可以编写他们想要的任何内容。


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


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


素胚勾勒不出你
浏览 143回答 3
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

牛魔王的故事

如果您确定数字的格式,您可以计算k字符串中的字符数,然后将其转换为数字并乘以适当的幂。$inp= "12.345kk";$count = substr_count($inp,'k');$number = (double)$inp*1000**$count;print($number);

鸿蒙传说

您的担心是有道理的,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 的程序员很容易理解它,因此更可取。
打开App,查看更多内容
随时随地看视频慕课网APP