Smarty: обрезать нули от конца строки / значения с плавающей запятой

Нужно отформатировать значение, обрезав нули с конца, таким образом:

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

?>

Это нормально, но я хочу спросить — есть ли какой-то другой, стандартный метод для этого?

1

Решение

Вы могли бы сделать для таких номеров, используя 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}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]