За последние 24 часа нас посетили 22011 программистов и 1104 робота. Сейчас ищут 712 программистов ...

Как убрать лишние нули после запятой ?

Тема в разделе "Регулярные выражения", создана пользователем dslychko, 22 апр 2008.

  1. dslychko

    dslychko Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Вывожу данные из mysql формат ячейки decimal.
    Выводятся в таком формате - 290.30 и 290.00
    Нужно убирать ненужные нули после запятой и саму запятую, если нужно.
    290.3 и 290
     
  2. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    было где-то уже
    PHP:
    1. <? printf('%d','290.30');  ?>
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    а надо
     
  5. dslychko

    dslychko Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Возвращает 290. Должно 290.3



    number_format нули не убирает





    PHP:
    1. <?
    2. function formatNumber( $number, $decimals=2, $dec_point=".", $thousands_sep=",") {
    3.     $nachkomma = abs($in - floor($in));
    4.     $strnachkomma = number_format($nachkomma , $decimals, ".", "");
    5.  
    6.     for ($i = 1; $i <= $decimals; $i++) {
    7.         if (substr($strnachkomma, ($i * -1), 1) != "0") {
    8.             break;
    9.         }
    10.     }
    11.    
    12.     return number_format($in, ($decimals - $i +1), $dec_point, $thousands_sep);
    13. }
    14. ?>
    15. Example:
    16.  
    17. formatNumber( 100.00 );
    18. --> 100
    19. formatNumber( 100.50 );
    20. --> 100.5
    21. formatNumber( 100.1234 );
    22. --> 100.12
    23. formatNumber( 100.12, 4 );
    24. --> 100.12
    25. formatNumber( 100.12345, 4 );
    26. --> 100.1234
    Это похоже на правду , но тоже не работает.
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $num = '290.30';
    3. print rtrim(rtrim($num, '0'), '.');
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    сорри, прочёл не внимательно
     
  8. dslychko

    dslychko Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Как всегда выручаете Сергей. Спасибо.
     
  9. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    PHP:
    1. <?php
    2. $num = '290.30';
    3. print (float)$num;
    4. $num = '290.00';
    5. print (float)$num;
    6. ?>
     
  10. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
  11. magiisto

    magiisto Активный пользователь

    С нами с:
    13 окт 2009
    Сообщения:
    1
    Симпатии:
    0
    Я, конечно, может чего-то не понимаю, программирую всего полгода. Но что вы тут понаписали...

    Php хранит данные типа float без нулей, значит это строка. Переведем строку в число:

    PHP:
    1. <? $num += 0 ?>
    2.  
    Всё. Так же удаляются все лидирующие нули, если они есть.

    PHP:
    1. <? $num = sprintf("%06.2",$a) ?>
    Добавляет нули перед (6) и после запятой (2) для float

    PHP:
    1. <? $num = sprintf("%04d",$a) ?>
    То же самое для целочисленных
     
  12. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    спасибо, magiisto
    во втором примере, видимо, имелось ввиду
    PHP:
    1. <?php $num = sprintf ("%06.2[b][u]f[/u][/b]", $a); ?>
    ?
     
  13. gcj

    gcj Активный пользователь

    С нами с:
    17 ноя 2012
    Сообщения:
    1
    Симпатии:
    0
    Код (Text):
    1. $sum = round($sum,2)*1;
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $number=290.30;
    2. echo number_format($number,1,'.',''); //290.3
    3. echo intval($number); //290 
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я за rtrim
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Просто на заметку: данные из MySQL выдаются в виде строки, а не в числовом виде.
    проверить это просто:
    Код (PHP):
    1. $row = mysql_fetch_assoc($result); var_export($row); //увидишь, что все значения в апострофах     
    Это может иметь значение. Будь готов и не удивляйся.
    Для MySQL: Для чисел с плавающей точкой в качестве разделителя десятичных знаков используется символ '.'.
    Для PHP: может быть либо точка либо запятая, в зависимости от текущей локали.
    То есть представление в виде строки может не совпадать!

    Пока число у нас представлено в настоящем числовом типе, нас не волнует никакая локаль. Но когда мы преобразуем из строки или в строку, могут быть баги.

    Итак буквально убрать лишние нули справа: rtrim($var, '0')
    Если после этого самым правым символом осталась десятичная точка — уберем и её: rtrim(rtrim($var, '0'), '.')

    Вариант "правильного" форматирования числа как числа:
    Код (PHP):
    1. printf('%.2F', (float)$var); 
    Здесь
    - сначала строку приводим к истинному вещественному типу,
    - в формате заглавная "F" означает вывод десятичной точки вне зависимости от настроек локали,
    - ".2" значит при выводе округлять до двух знаков после запятой (денежный формат).
    Вместо printf() можно number_format(), если в нем явно указать точку.

    P.S. Если мы вдруг обнаруживаем, что в вычислениях с дробными числами вдруг пропали знаки после запятой — это говорит о том, что мы работали со строками вместо чисел и эти строки не соответствуют настройкам локали (точка вместо запятой или наоборот), поэтому неявное приведение типа приводит к отбрасыванию дробной части.
     
  17. crazyCoder

    crazyCoder Активный пользователь

    С нами с:
    22 ноя 2012
    Сообщения:
    1
    Симпатии:
    0
    Код (PHP):
    1. // в русской локали разделитель зпт, исправим это (только для чисел)
    2.    setlocale(LC_NUMERIC, "C");
    3.  
    4. // радуемся
    5.    $number = (float)$number; 
    Итого:
    250.00 → 250
    250,50 → 250.5
    250.55 → 250.55
     
  18. alexeyq

    alexeyq Новичок

    С нами с:
    1 ноя 2019
    Сообщения:
    1
    Симпатии:
    0
    PHP:
    1. $s=0.00012530;
    2. echo $s."\n";
    3.  
    4. $s="0.00012530";
    5. echo $s."\n";
    6.  
    7. echo ($s*1)."\n";
    0.0001253
    0.00012530
    0.0001253

    просто умножите на 1
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    чувак, ты зарегался только чтобы поднять мёртвую тему? )))

    ответ неверный. хотите вывести с конкретной точностью — используйте функции форматирования чисел. "умножить на один" означает неявное приведение типа от строки к числу. для того тоже есть специальные встроенные функции. не надо этого вот шаманства.
    — К.О.
     
  20. Greider

    Greider Активный пользователь

    С нами с:
    20 ноя 2013
    Сообщения:
    9
    Симпатии:
    0
    А если немного усложнить задачу.

    Мне нужно выводить копейки (два знака после запятой) в любом случае, даже если они по нулям. А все что дальше, тысячные и далее - только если отличны от нуля.
    290.00000 - > 290.00
    290.123400 - > 290.1234
    290.10000 -> 290.10

    Сижу голову ломаю )
     
  21. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    https://www.php.net/manual/ru/class.numberformatter.php
    Но есть нюансы.
    Если не осилите, то
    PHP:
    1. <?php
    2. $str = '290.12340000';
    3. $fl = (float)$str;
    4. //echo $str;
    5. //echo $fl;
    6.  
    7. list(, $r) = explode('.', $fl);
    8. if(strlen($r) > 2)
    9. {
    10. echo $fl;
    11. }
    12. else
    13. {
    14. echo number_format($fl, 2, '.', '');
    15. }
    16. ?>