разделить число по разрядам php
Разделить число по разрядам php
В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.
Агент
PHP парсер юзер агента с поддержкой Laravel, работающий на базе библиотеки Mobile Detect.
Как разбить число на разряды (тысячи, миллионы и т.д.)?
Фото. Лайки. При достижении 1 000 или 10 000 лайков, цифры выводятся таким образом:
Интересует, как разделять тысячные, миллионные и т.п значения, чтобы например, было так
Возможно, в PHP есть стандартная функция, которая этим занимается?
6 ответов 6
Внезапно, для форматирования чисел используется number_format.
number
Форматируемое число.
decimals
Устанавливает число знаков после запятой.
dec_point
Устанавливает разделитель дробной части.
thousands_sep
Устанавливает разделитель тысяч.
number_format() — Форматирует число с разделением групп
$str = 10000; number_format($str, 0, ‘.’, ‘ ‘);
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.24.40305
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
number_format
(PHP 4, PHP 5, PHP 7, PHP 8)
number_format — Форматирует число с разделением групп
Описание
Форматирует число сгруппированными тысячами и, возможно, десятичными цифрами.
Список параметров
Устанавливает разделитель дробной части.
Устанавливает разделитель тысяч.
Возвращаемые значения
Список изменений
Примеры
Пример #1 Пример использования number_format()
Во Франции обычно используются 2 знака после запятой (‘,’), и пробел (‘ ‘) в качестве разделителя групп. Этот пример демонстрирует различные способы форматирования чисел:
Смотрите также
User Contributed Notes 38 notes
It’s not explicitly documented; number_format also rounds:
Outputs a human readable number.
if you want to benchmark all costs for 5 seconds:
(with ms meaning milliseconds and s meaning seconds)
I ran across an issue where I wanted to keep the entered precision of a real value, without arbitrarily rounding off what the user had submitted.
I figured it out with a quick explode on the number before formatting. I could then format either side of the decimal.
You can change %03d to %04d, etc.
See also the documentation for localeconv, which will provide values for decimal point and thousands separator from the C standard library.
Of course localeconv features many more locale information, like indicating to put the negative sign behind the value for some locale settings which can’t be used to customize present number_format.
Simple function to show money as only dollars if no cents, but will show 2 decimals if cents exist.
The ‘cents’ flag can force to never or always show 2 decimals
And remember to always contribute custom functions if they might be useful to the rest of us or future versions of the php language.
Just an observation:
The number_format rounds the value of the variable.
$val1 = 1.233;
$val2 = 1.235;
$val3 = 1.237;
echo number_format($val1,2,»,»,».»); // returns: 1,23
echo number_format($val2,2,»,»,».»); // returns: 1,24
echo number_format($val3,2,»,»,».»); // returns: 1,24
//again check through array for non numerical characters but skipping allready processed keys
//if is not number remove from array
// Here is a function that produces the same output as number_format() but also works with numbers bigger than 2^53.
$original_number= 9223372036854775805;
echo a_number_format($original_number, 4, ‘.’,»‘»,3);
// Outputs: 9’223’372’036’854’775’805.1230
In my function my_number_format() [shown below] there was a bug.
Here is the corrected version:
?>
Thanks to Federico Cassinelli for the bug report.
[EDIT BY danbrown AT php DOT net: The original note follows.]
But I have a problem with that: I want to add commas as thousand separators and change the decimal-separator (this could also be done with str_replace), but I do not want to change the amount of fractional digits!
But since the 2nd argument of number_format is necessary to enter the 3rd and 4th argument, this cannot be done with number_format. You have to change the fractional digits with this function.
But I want that 1234.56 changes into 1.234,56 and 1234.567890123456 changes into 1.234,567890123456
So, I created following function, that doesn’t change the amount of fractional digits:
A simple funtion to format american dollars.
To prevent the rounding that occurs when next digit after last significant decimal is 5 (mentioned by several people below):
What do you do if some of your numbers have decimal places, and some don’t? You can switch between functions, but if you’re building it in a loop, that’s not a good solution. Instead, we have the same as below, with a slight change:
function number_format_unlimited_precision($number,$decimal = ‘.’) <
$broken_number = explode($decimal,$number);
if($broken_number[1]==0) <
return number_format($broken_number[0]);
>else <
return number_format($broken_number[0]).$decimal.$broken_number[1];
>;
>;
formatting numbers may be more easy if u use number_format function.
I also wrote this :
function something($number)
<
$locale = localeconv();
return number_format($number,
$locale[‘frac_digits’],
$locale[‘decimal_point’],
$locale[‘thousands_sep’]);
>
function formats numbers of datetime type,
[ «zaman» ]= «1983-8-28 5:5:5» ;
Don’t forget to specify thousands_sep that default is ‘,’ to another value, otherwise function will return null.
This way, I use my 1st variable for calculations and my 2nd variable for output. I’m sure there are better ways to do it, but this got me back on track.
simpler function to convert a number in bytes, kilobytes.
?>
you may also add others units over PeraBytes when the hard disks will reach 1024 PB 🙂
If you want a number of digits after the point, but not unnecessary zeros.
Eg.
number_format(1.20000,4) = 1.2000
num_format(1.20000,4,0) = 1.2
number_format(1.20000,4) = 1.2000
num_format(1.20000,4,2) = 1.20
number_format(1.23456,4) = 1.2345
num_format(1.23456,4,2) = 1.2345
I’d like to comment to the old notes of «stm555» and «woodynadobhar».
They wrote about «number_format_unlimited_precision()».
I guess many of us need that kind of function, which is the almost same function as number_format but don’t round a number.
Does Anyone know any new solution in a recent PHP version?
If you use space as a separator, it will break on that space in HTML tables.
Furthermore, number_format doesn’t like ‘ ‘ as a fourth parameter. I wrote the following function to display the numbers in an HTML table.
function to convert numbers to words
indian: thousand,lakh,crore
Note: function can only convert nos upto 99 crores
I’m not sure if this is the right place anyway, but «ben at last dot fm»‘s ordinal function can be simplified further by removing the redundant «floor» (the result of floor is still a float, it’s the «%» that’s converting to int) and outer switch.
Note that this version also returns the number with the suffix on the end, not just the suffix.
This is a simple and useful function to convert a byte number in a KB or MB:
if you want as a separator and use windows charset this piece of code may help:
echo convertNumberToWordsForIndia ( «987654321» );
//Output ==> Indian Rupees Ninty Eight Crores Seventy Six Lakhs Fifty Four Thousand Three Hundred & Twenty One Only.
?>
Разделение числа на разряды с помощью регулярного выражения
Было: 1234567890
Стало: 1,234,567,890
Интуитивно понятно как решить эту задачу вручную, на бумаге. Нужно просто идти справа налево и через каждые три цифры ставить запятую.
А можно ли сформулировать это решение на языке регулярных выражений?
Что эта фигня значит?
Щас разберемся. Для простоты возьмем число 1234.
Здесь разряд обозначен квадратными скобками.
Но высказывание «от конца числа насчитывается три цифры до места после цифры 1» направлено справа налево, а для написания регулярного выражения нам нужно высказывание, направленное слева направо. Для получения такого высказывания просто развернем предыдущее высказывание задом наперед.
Как несложно догадаться, результатом будет:
«от места после цифры 1 насчитывается три цифры до конца числа».
Значит, если от места после цифры 1 насчитывается три цифры до конца числа, значит, место после цифры 1 является местом разделения разрядов.
Разберем это высказывание по частям и запишем на языке регулярных выражений.
Видно, что высказывание состоит из следующих частей:
1. «от места после цифры 1»
2. «насчитывается три цифры»
3. «до конца числа»
Впереди «насчитываются три цифры». Три цифры записываются так:
Плюс, впереди находится «конец числа». Конец числа записывается так:
Тут требуется пояснение. Дословно эта конструкция означает «место, после которого нет цифры», и, вообще говоря, эта конструкция не является концом числа в общем случае. Но в нашем конкретном случае эта конструкция подходит. За подробностями отсылаю к Фридлу.
Соединим все три части в одно выражение:
Однострочник для проверки:
Результатом выполнения будет 1,234.
Регулярное выражение, однако, пока еще не закончено. Если вместо числа 1234 взять число подлиннее, например, 1234567890, то результатом выполнения будет 1234567,890.
А где остальные запятые? Почему выделен только один разряд?
А полностью регулярное выражение теперь будет выглядеть так:
Запомним это выражение, оно пригодится дальше.
Опаньки. Результат 1,234567890.
В первую очередь возникает мысль о том, что жадный квантификатор + захватил все возможные тройки. Это действительно так, но причина, все-таки, не в жадности квантификатора. Причина в том, что по умолчанию регулярное выражение ищет только одно совпадение из всех возможных. Ну, а то, что это совпадение из-за жадности квантификатора оказывается максимально длинным, это уже не существенно.
А какие вообще есть возможные совпадения? Давайте разберемся. Запишем в квадратных скобках тройки цифр:
Поскольку квантификатор + является жадным, то выражение (\d<3>)+ совпадает со всеми тройками цифр. Обозначим совпадение круглыми скобками:
1. 1, ( [ 234 ][ 567 ][ 890 ] )
Вот это первое максимально длинное совпадение и отделяется запятой. Но ведь есть и другие совпадения, менее длинные, которые тоже нужно отделить запятыми:
Для этого надо заставить регулярное выражение не останавливаться после нахождения первого совпадения и найти два оставшихся возможных совпадения.
Чтобы регулярное выражение искало все возможные совпадения, нужно к оператору s/// добавить модификатор g.
Ага, теперь результатом выполнения будет 1,234,567,890.
Проведем контрольную проверку с числом 123456789:
Как видите, впереди числа появилась лишняя запятая. Откуда она взялась? Она взялась из-за еще одного возможного совпадения, которого не было в числе 1234567890, но которое есть в числе 123456789:
Тут все число состоит из троек цифр. Поэтому регулярное выражение дает совпадение со всем числом целиком.
Формально все правильно, но здравый смысл подсказывает, что слева от числа ставить запятую бессмысленно. А почему, собственно? Очевидно, потому, что запятыми мы разделяем цифры, а слева от этой лишней запятой ни одной цифры нет.
Значит, в регулярное выражение нужно добавить условие, требующее ставить запятые только в тех местах, слева от которых цифра есть.
Высказывание «место, слева от которого есть цифра» состоит из следующих частей:
1. «место, слева от которого»
2. «есть цифра»
Разделить число по разрядам php
Синтаксис
Целые числа ( int ) могут быть указаны в десятичной (основание 10), шестнадцатеричной (основание 16), восьмеричной (основание 8) или двоичной (основание 2) системе счисления. Для задания отрицательных целых ( int ) используется оператор отрицания
Начиная с PHP 7.4.0, целочисленные литералы могут содержать подчёркивания ( _ ) между цифрами для лучшей читаемости литералов. Эти подчёркивания удаляются сканером PHP.
Пример #1 Целые числа
Формально структура целых чисел ( int ) соответствует PHP 7.4.0 (ранее подчёркивания не допускались):
Переполнение целых чисел
Пример #2 Переполнение целых на 32-битных системах
Пример #3 Переполнение целых на 64-битных системах
Преобразование в целое
Из булевого типа
Из чисел с плавающей точкой
Если число с плавающей точкой превышает размеры int (обычно +/- 2.15e+9 = 2^31 на 32-битных системах и +/- 9.22e+18 = 2^63 на 64-битных системах, результат будет неопределённым, так как float не имеет достаточной точности, чтобы вернуть верный результат в виде целого числа ( int ). В этом случае не будет выведено ни предупреждения, ни даже замечания!
Значения NaN и Infinity при приведении к int становятся равными нулю, вместо неопределённого значения в зависимости от платформы.
Из строк
Если строка содержит числа или ведущая числовая, тогда она будет преобразована в соответствующее целочисленное значение, в противном случае она преобразуется в ноль ( 0 ).
Из NULL
Значение null всегда преобразуется в ноль ( 0 ).
Из других типов
Для других типов поведение преобразования в int не определено. Не полагайтесь на любое наблюдаемое поведение, так как оно может измениться без предупреждения.
User Contributed Notes 25 notes
Here are some tricks to convert from a «dotted» IP address to a LONG int, and backwards. This is very useful because accessing an IP addy in a database table is very much faster if it’s stored as a BIGINT rather than in characters.
Be aware of float to int cast overflow
// You may expected these
var_dump ( 0x7fffffffffffffff ); // int(9223372036854775807)
var_dump ( 0x7fffffffffffffff + 1 ); // float(9.2233720368548E+18)
var_dump ((int)( 0x7fffffffffffffff + 1 )); // int(9223372036854775807)
var_dump ( 0x7fffffffffffffff + 1 > 0 ); // bool(true)
var_dump ((int)( 0x7fffffffffffffff + 1 ) > 0 ); // bool(true)
var_dump ((int) ‘9223372036854775807’ ); // int(9223372036854775807)
var_dump ( 9223372036854775808 ); // float(9.2233720368548E+18)
var_dump ((int) ‘9223372036854775808’ ); // int(9223372036854775807)
var_dump ((int) 9223372036854775808 ); // int(9223372036854775807)
var_dump((int) «010»); //output 10
Casting to an integer using (int) will always cast to the default base, which is 10.
Casting a string to a number this way does not take into account the many ways of formatting an integer value in PHP (leading zero for base 8, leading «0x» for base 16, leading «0b» for base 2). It will simply look at the first characters in a string and convert them to a base 10 integer. Leading zeroes will be stripped off because they have no meaning in numerical values, so you will end up with the decimal value 10 for (int)»010″.
Converting an integer value between bases using (int)010 will take into account the various ways of formatting an integer. A leading zero like in 010 means the number is in octal notation, using (int)010 will convert it to the decimal value 8 in base 10.
This is similar to how you use 0x10 to write in hexadecimal (base 16) notation. Using (int)0x10 will convert that to the base 10 decimal value 16, whereas using (int)»0x10″ will end up with the decimal value 0: since the «x» is not a numerical value, anything after that will be ignored.
If you want to interpret the string «010» as an octal value, you need to instruct PHP to do so. intval(«010», 8) will interpret the number in base 8 instead of the default base 10, and you will end up with the decimal value 8. You could also use octdec(«010») to convert the octal string to the decimal value 8. Another option is to use base_convert(«010», 8, 10) to explicitly convert the number «010» from base 8 to base 10, however this function will return the string «8» instead of the integer 8.
Casting a string to an integer follows the same the logic used by the intval function:
Returns the integer value of var, using the specified base for the conversion (the default is base 10).
intval allows specifying a different base as the second argument, whereas a straight cast operation does not, so using (int) will always treat a string as being in base 10.
php > var_export((int) «010»);
10
php > var_export(intval(«010»));
10
php > var_export(intval(«010», 8));
8