[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: форматирование строки наоборот, нужна помощь
gorlum15
Ломаю голову несколько дней, затупил совсем
может есть спецы кто подскажет?
Суть вопроса:
Существует php функция

function format($chislo) {
$chislo += 9.99999999999999954748112e-7;
$chislo = round( $chislo, 2 );
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
echo format(55555555555555555555555555555555); // результат выполнения 55555555555555557535956863025152.00

Мне нужно сделать в точности наоборот - из получившейся форматной строки 55555555555555557535956863025152.00 получать исходное значение 55555555555555555555555555555555

Пожалуйста помогите в написании функции или в какую сторону копать )
Игорь_Vasinsky

Но ты его округляешь же потом
Цитата
$chislo = round( $chislo, 2 );

усё - точности уже не будет.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
gorlum15
точность не нужна, хотя бы примерное восстановление
допустим исходная функция даже такая пусть будет
function format($chislo) {
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
Игорь_Vasinsky
function format($chislo) {
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}

наверно так как то
function unformat($chislo) {
$chislo = sprintf( "%d", $chislo );
return $chislo;
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
не.. не вышло)

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
S.Chushkin
Цитата (gorlum15 @ 11.11.2013 - 09:45)
echo format(55555555555555555555555555555555); // результат выполнения 55555555555555557535956863025152.00

Число типа FLOAT имеет ограничение числа цифр - 15. (всё что больше у вас, это мусор) см. http://www.php.net/manual/ru/language.types.float.php
Используйте для больших чисел одну из соответствующих библиотек и будет Вам счастье.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
gorlum15
Цитата (S.Chushkin @ 11.11.2013 - 10:53)
55555555555555557535956863025152


Все-таки дело не в ограничении FLOAT. Потому что к примеру
echo format(55555555555555557535956863025152.00) вернет исходное значение 55555555555555557535956863025152.00 , хотя как Вы видите символов больше чем 15. Я думаю решение должно быть
gorlum15
Цитата (Игорь_Vasinsky @ 11.11.2013 - 10:04)
не.. не вышло)

function unformat($chislo) {$chislo = sprintf( "%d", $chislo );return $chislo;}

Спасибо что откликнулись, но так я уже пробовал ) Не выходит ..
Игорь_Vasinsky
ты понимаешь - сервер считая не может строить догадок , ты округляешь число - делаешь его не точным - соот-но обратный процесс - тоже вернёт не то число

смотри, давай найдём частное между числами - чтобы увидеть во сколько раз они отличаются друг от друга

5555555555555555934795202560.00 - вернула твоя функция от числа
5555555555555555555555555555

$ res = bcdiv('5555555555555555555555555555','5555555555555555934795202560.00', 10);
//отличие в 0.9999999999 раз


теперь попробуем получить число назад - возьмём полученное после твоей функции число - и умножим его на число $res - это логично

что в итоге получаем?

$chislo = (0.999999 * 5555555555555555934795202560.00);
echo number_format($chislo,0, 0,'');

//5555550000000000580378427392



сравнивай
было
5555555555555555555555555555
твоя функция вернула
5555555555555555934795202560.00
хотим превратить обратно - получаем
5555550000000000580378427392

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
gorlum15
$chislo = '55555555555555555555555555555555';
function format($chislo) {
$chislo += 9.99999999999999954748112e-7;
$chislo = round( $chislo, 2 );
$chislo = sprintf( "%01.2f", $chislo );
return $chislo;
}
$format_chislo = format($chislo); // результат выполнения 55555555555555557535956863025152.00



$res = bcdiv($chislo,$format_chislo, 1000);
echo bcmul($format_chislo, $res, 1000); // результат выполнения 55555555555555555555555555555554.99

Игорь спасибо!
Игорь_Vasinsky
а.. типо точность нудно было больше брать? ... ктож думал.. я и так 10 цифр после запятой взял))

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
Цитата
echo bcmul($format_chislo, $res, 1000); // результат выполнения 55555555555555555555555555555554.99

а если ceil() добавишь - то получишь в идеале)

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.