从字符串中删除末尾的零

5
我希望根据以下规则删除尾随零:
  • 输入的数字将始终具有4位小数
  • 输出的数字应始终具有2到4位小数
  • 如果小数点后的最后两个数字为零,则同时删除它们
  • 如果小数点后的最后一个数字为零,则删除它

示例:

  • 1.0000 -> 1.00
  • 1.4000 -> 1.40
  • 1.4100 -> 1.41
  • 1.4130 -> 1.413
  • 1.4136 -> 1.4136

我考虑了以下内容:

if (substr($number, -2) == '00') return substr($number, 0, 4);
if (substr($number, -1) == '0') return substr($number, 0, 5);
return $number;

有没有更好的方法来做这件事?

3个回答

12

我认为这应该有效:

return preg_replace('/0{1,2}$/', '', $number);

$strings = array ('1.4000', '1.4100', '1.4130', '1.4136', '1.4001', '1.0041');
foreach ($strings as $number) {
  echo "$number -> " . preg_replace('/0{0,2}$/', '', $number) . "\n";
}

Produces:

会生产:
1.4000 -> 1.40
1.4100 -> 1.41
1.4130 -> 1.413
1.4136 -> 1.4136
1.4001 -> 1.4001
1.0041 -> 1.0041

1
这里应该足够使用 {1,2} - Dogbert
@jcsanyi 你需要使用 {2,}? 来使其变为非贪婪模式。 - Barmar
1.40011.0041怎么样? - Floris

0
这是Barmar解决方案的一个变体,即使输入字符串不总是恰好有4个小数位,它也可以工作。它不会添加缺失的零,但也不会剥夺任何多余的内容。
return preg_replace('/(\.[0-9]{2,}?)0*$/', '$1', $number);

作为一个例子:
$strings = array(
    '1.4000',
    '1.4100',
    '1.4130',
    '1.4136',
    '1.0',
    '1.00',
    '1.000',
    '10000',
);
foreach ($strings as $number) {
    $fixed = preg_replace('/(\.[0-9]{2,}?)0*$/', '$1', $number);
    echo "{$number} -> {$fixed}\n";
}

输出:

1.4000 -> 1.40
1.4100 -> 1.41
1.4130 -> 1.413
1.4136 -> 1.4136
1.0 -> 1.0
1.00 -> 1.00
1.000 -> 1.00
10000 -> 10000

正则表达式,哈哈。你一定是疯了或者 Perl 程序员。 - u_mulder
知道这是一个旧答案,但是...“即使输入字符串不总是恰好有4位小数”,为什么1.000010000会变成1010000 - vallentin

0

现在来点完全不同的东西...

<?php
$crlf = "\n";
$input = array('1.4000', '1.4300', '1.2340', '1.4012', '1.0034', '1.2', '1.23456');
foreach ($input as $in) {
  for($n = 4; $n>2; $n--) {
    $f1 = (float)round($in, $n);
    $f2 = (float)round($in, $n-1);
    if ($f1 !== $f2) break;
  }
  echo "for in = ".$in." out is ".number_format($in, $n) . $crlf;
}
?>

输出:

for in = 1.4000 out is 1.40
for in = 1.4300 out is 1.43
for in = 1.2340 out is 1.234
for in = 1.4012 out is 1.4012
for in = 1.0034 out is 1.0034
for in = 1.2 out is 1.20
for in = 1.23456 out is 1.2346

请注意,对于格式正确的数字(小数点后正好四位),它将按预期运行,但是当数字未正确格式化时,它仍将运行。这不完全符合要求,但通常具有强大的解决方案比极简主义更好...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接