2013-06-22 2 views
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; 

Есть ли лучшие способы сделать это?

ответ

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"; 
} 

Производит:

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

+0

@ Dogbert Хорошая точка, исправлена. – Barmar

+0

@jcsanyi Вам нужно использовать '{2,}?', Чтобы сделать его неживым. – Barmar

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 
+0

Регулярные выражения, lolz. Вы должны быть орешниками или Perl-программистами. –

+0

Знайте, что это старый ответ, но ... 'даже если строки ввода не всегда имеют ровно 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 

Обратите внимание, что это будет вести себя так, как ожидалось, для должным образом отформатированных чисел (с точностью до четырех цифр после десятичной), но оно будет по-прежнему вести себя, когда цифры были неправильно отформатированы. Не совсем то, о чем просили, но часто лучше иметь надежное решение, чем минималистское ...