PHP 将任何公斤数转换为可读的公制单位

PHP Convert any kg amount to a readable metric unit

我正在尝试创建一个数学函数(在 PHP 中),它将采用给定的公斤数,并将它们转换为可读形式或更好的形式,return 最适合的单位对于那个数额。输入将始终为 kg。最好是log.

例如:

5公斤=(5)公斤

0.5 公斤 = (500) 克

1000 公斤 = (1) 吨

0.001 公斤 = (1) 克

0.0001 公斤 = (100) 毫克

我知道有一种方法可以使用 log 或 log10 函数来实现,但我想不通。

怎么做到的?

我认为这样的事情应该可行,但我相信有人可以做出更好的解决方案。

function outputWeight($kg)
{
  $power = floor(log($kg, 10));    
  switch($power) {
    case 5  :
    case 4  :
    case 3  : $unit = 'ton'; 
              $power = 3;
              break;
    case 2  :
    case 1  :    
    case 0  : $unit = 'kilogram'; 
              $power = 0;
              break;
    case -1 : 
    case -2 : 
    case -3 : $unit = 'gram'; 
              $power = -3;
              break;
    case -4 : 
    case -5 : 
    case -6 : $unit = 'milligram'; 
              $power = -6;
              break;
    default : return 'out of range';
  }
  return ($kg / pow(10, $power)) . ' ' . $unit;
}  

echo outputWeight(0.015) . '<br>';
echo outputWeight(0.15) . '<br>';
echo outputWeight(1.5) . '<br>';
echo outputWeight(15) . '<br>';
echo outputWeight(150) . '<br>';

想法是您可以轻松扩展范围。这将输出

15 gram
150 gram
1.5 kilogram
15 kilogram
150 kilogram

我没有彻底测试这段代码!

我发现自己同意 Kiko 的观点,即最短的代码并不总是最好的或最易读的。

考虑到这一点,将 log 纳入其中似乎是不必要的复杂化。所以我建议使用原始代码的精简版:

function readableMetric($mass)
{
    $units = [
        -3 => "tonne",
         0 => "kg",
         3 => "g",
         6 => "mg",
    ];

    foreach ($units as $x => $unit) {
        if ( ($newMass = $mass * 10 ** $x)  >= 1 ) {
            return "{$newMass} {$unit}";
        }
    }
}
  • 这更具可扩展性(例如,您可以轻松添加 centigram

  • 数学对大多数人来说都很直观(10 的幂)

  • 如果你真的想要golf它,你可以将它缩小到一个衬里:

     function readableMetric($m)
     {
         foreach([-3=>"tonne",0=>"kg",3=>"g",6 =>"mg"] as $x=>$g)if(($n=$m*10**$x)>=1)return"$n $g";
     }
    


原答案

你可以用一系列 if / else 语句来完成吗?

$values = [
    5, 0.5, 1000, 0.001, 0.0001
];



function convertmass($mass) : string
{
    if ($mass >= 1000) {
        return ($mass / 1000) . " ton";
    }
    elseif ($mass < 0.001) {
        return ($mass * 1000000) . " mg";
    }
    elseif ($mass < 1) {
        return ($mass * 1000 ) . " g";
    }
    else {
        return $mass . " kg";
    }
}

foreach ($values as $mass) {
    echo convertmass($mass), PHP_EOL;
}

输出:

5 kg
500 g
1 ton
1 g
100 mg

如果你想要稍微 easier/more readable/more 用户友好的更新来添加新的测量,那么你可以做这样的事情:

$values = [
    5, 0.5, 1000, 0.001, 0.0001
];



function convertmass($mass) : string
{

    $massLookup = [
        [ "unit" => "kg",    "min" => 1,        "max" => 1000,    "multiple" => 1],
        [ "unit" => "tonne", "min" => 1000,     "max" => 1000000, "multiple" => 0.001],
        [ "unit" => "g",     "min" => 0.001,    "max" => 1,       "multiple" => 1000],
        [ "unit" => "mg",    "min" => 0.000001, "max" => 0.001,   "multiple" => 1000000],
    ];

    foreach ($massLookup as $unit) {
        if ($mass >= $unit["min"] && $mass < $unit["max"]) {
            return ($mass * $unit["multiple"]) . " {$unit["unit"]}";
        }
    }

    return "Measurement {$mass} kg is out of range";
}

foreach ($values as $mass) {
    echo convertmass($mass), PHP_EOL;
}

玩了一段时间后,这是我想出来的

    function readableMetric($kg)
    {
        $amt = $kg * pow(1000, 3);
        $s = array('mcg', 'mg', 'gm', 'kg','tonne');
        $e = floor(log10($amt)/log10(1000));
        return [
            "amount" => $amt/pow(1000, $e),
            "unit"   => $s[$e]
        ];
    }

以下函数在内部使用一个数组,赋值单位=>转换因子。该阵列可以轻松扩展或修改以满足您自己的要求。函数中使用了 1000 的固定限制。这意味着除了吨之外,产值总是小于 1000。使用预设为 2 的附加参数,可以更改最大小数位数。

function scaleKg(float $kg, int $decimalPlaces = 2) : string {
  $scale = [
    'micrograms' => 1.E9,
    'milligram' => 1.E6,
    'gram' => 1.E3,
    'kilogram' => 1,
    'ton' => 1.E-3,
  ];
  foreach($scale as $unit => $factor){
    $mass = $kg * $factor;
    if($mass < 1000) {
      return round($mass,$decimalPlaces).' '.$unit;
    }
  } 
  return round($mass,$decimalPlaces).' '.$unit;
}

一些例子:

$kg = 1.212345;
echo scaleKg($kg);  //1.21 kilogram

$kg = 455;
echo scaleKg($kg);  //455 kilogram

$kg = 0.0456;
echo scaleKg($kg);  //45.6 gram

$kg = 23456;
echo scaleKg($kg);  //23.46 ton

$kg = 23489000;
echo scaleKg($kg);  //23489 ton

$kg = 167E-6;
echo scaleKg($kg);  //167 milligram