Нужно отформатировать значение, обрезав нули с конца, таким образом:
3 => 3
3. => 3
3.0 => 3
3.00 => 3
3.000 => 3
3.009 => 3.009
3.003 => 3.003
3.01 => 3.01
3.10 => 3.1
3.16 => 3.16
Нашел плагин-модификатор Smarty, который будет выполнять работу {$ var | zero_cut: 4}:
Source: http://www.smarty.net/forums/viewtopic.php?p=17482
vl@vl plugins $ cat modifier.zero_cut.php
<?php
/**
* Smarty insignificant zero cutter modifier plugin
*
* Type: modifier<br>
* Name: zero_cut<br>
* Purpose: Format string, representing float value with given
* number of digits after decimal point with deletion
* of insignificant zeros.
*
* Example: {$var|zero_cut:2} , where 2 is number of significant
* digits after decimal point to show
* if number is 0(by default), function returns
* sprintf("%.0f",$str)
*
* input string must be separated with '.' symbol
*
* Date: January 29,2005
* @author `VL <[email protected]>
* @version 1.0
* @param string
* @param integer
* @return string
*
* Example output:
*
* 3 => 3
* 3. => 3
* 3.0 => 3
* 3.00 => 3
* 3.000 => 3
* 3.009 => 3.01
* 3.003 => 3
* 3.01 => 3.01
* 3.10 => 3.1
* 3.16 => 3.16
*
*/
function smarty_modifier_zero_cut($str,$digits=0)
{
# format value with given number of digits after decimal point
$value=sprintf("%.${digits}f",$str);
if(0==$digits)
return $value;
# break it in 2 parts
list($left,$right)=explode (".",$value);
# now we move the string, starting from the end
# and counting how many insignificant zeros exists
$len=strlen($right); # got length
$k=0; # how many symbols to skip,starting from end of string
{
# found insignificant zero, increase counter
if('0'==$right{$i})
$k++;
else
break; # found insignificant digit, stop moving
}
# drop counted number of symbols at the end of string
$right=substr($right,0,$len-$k);
# if right part is not empty, add decimal point symbol
if(""!=$right)
$right=".$right";
# return whole value
return $left.$right;
}
?>
for($i=$len-1;$i>=0;$i--)
{
# found insignificant zero, increase counter
if('0'==$right{$i})
$k++;
else
break; # found insignificant digit, stop moving
}
# drop counted number of symbols at the end of string
$right=substr($right,0,$len-$k);
# if right part is not empty, add decimal point symbol
if(""!=$right)
$right=".$right";
# return whole value
return $left.$right;
}
?>
Это нормально, но я хочу спросить — есть ли какой-то другой, стандартный метод для этого?
Вы могли бы сделать для таких номеров, используя rtrim
функция:
Данные PHP:
$data = ['3', '3.','3.0','3.00','3.000','3.009','3.003','3.01','3.10','3.16'];
$smarty->assign('values',$data);
Smarty файл:
{foreach $values as $val}
{$val} => {$val|rtrim:'0'|rtrim:'.'}<br />
{/foreach}
Выход:
3 => 3
3. => 3
3.0 => 3
3.00 => 3
3.000 => 3
3.009 => 3.009
3.003 => 3.003
3.01 => 3.01
3.10 => 3.1
3.16 => 3.16
но, очевидно, это не будет работать во всех случаях. Например для 30
это также урежет это к 3
поэтому вы должны немного изменить его, чтобы обнаружить .
в аргументе:
{foreach $values as $val}
{$val} =>
{if $val|strpos:'.' eq true}
{$val|rtrim:'0'|rtrim:'.'}<br />
{else}
{$val}<br />
{/if}
{/foreach}
Других решений пока нет …