Как грамотно преобразовать строковое значение

440hz

php.ru
Как грамотно преобразовать строковое значение

есть

$a = '1,5';

надо получить $b = что-то($a) равную 1.5

как красиво и грамотно это сделать?
 

Фанат

oncle terrible
Команда форума
лично я так и делаю, никогда не задумывался о грамотности такого подхода.

может, тебе после замены надо проверить результат на валидность?
 

440hz

php.ru
Автор оригинала: Фанат
лично я так и делаю, никогда не задумывался о грамотности такого подхода.

может, тебе после замены надо проверить результат на валидность?
спасибо. поясню проблему.

есть поле ввода. например цена. для разных юзеров(стран) разделителем дробной части является как точка так и запятая. хочется получить на выходе сразу float. str_replace это понятно. эь не проблема. думал может есть более грамотное и красивое решение.

т.е. не зависисомти что ввел юзер 1.55 или 1,55 в результате получить в переменную (float) 1.55
 

Фанат

oncle terrible
Команда форума
440hz
что-то мне ОЧЕНЬ сомнительно, что тебе нужно именно float.
Очень, очень сомнительно.
Лично я боюсь флоата, как чёрт ладана.
И стринг меня в большинстве случаев устраивает гораздо больше
 

440hz

php.ru
что-то мне ОЧЕНЬ сомнительно, что тебе нужно именно float
ну тогда еще раз уточним. поле для ввода цены. юзер вводит 1.55 или 1,55. Мне в обработчике надо это значение еще немного обработать. скажем умнолжить на 0.25. если придет 1,55 то при преобразовании во float получим 1 вместо 1.55.

вот я и спрашиваю как поступать в таком случае. считать что юзер дурак или все-таки похлопотать о преобраховании.

и есть ли какие правильные решения на этот счет.

всегда прогонять через str_replace(',','.',$price) и не парится?
 

hermit_refined

Отшельник
У меня вообще привычка хранить цену в int - копейках/центах.
А преобразую либо str_replace(), либо - когда предполагаю, что юзер совсем дурак - проверяю preg_match(): цена - не id-шник, иногда важно знать, что именно пользователь имел в виду ;-)
 

440hz

php.ru
hermit_refined

да. цена в базе лежит как int. но вот ввод цены нужно проконтролировать.
 

Фанат

oncle terrible
Команда форума
если оно в базе лежит, как int (хотя лично я храню, как децел), то НЕПОНЯТНО, зачем тебе его преобразовывать во флоат.
по-моему, ты ещё сам не до конца понял, что тебе нужно.
А это делает бессмысленными любые вопросы на форуме.
 

440hz

php.ru
Фанат

поясню еще раз.

ко мне приходит 1,55 из поля цена. что бы его хранить как int мне его надо умножить на 100.

$a = '1,55';
$price = $a * 100;

в результате $price 100 вместо 155.

теперь тебе понятно?
 

Андрейка

Senior pomidor developer
440hz
:)))))))))))))))))))))))))))))))

в результате $price 100 вместо 155
значит надо заменять запятую на точку :)) или ты в этом сомневаешся?
узнать, что там у клиента настроено фик получится => спец.функции, решающей ошибся клиент или нет не предвидицца или ты надеешся, что она есть?
str_replace заменит запятую на точку, но тебе надо другую функцию?
 

Фанат

oncle terrible
Команда форума
нет, всё равно непонятно, чем тебя не устраивает (float)str_replace и какого такого священного грааля ты ищешь.
 

__vampiro__

Новичок
Ему вообще надо убирать все символы, кроме цифр. И не канифолить мозг преобразовывая во флоат и умножая на 100.

1,55 => 155 и не надо морочить голову. (либо сделать в форме 2 поля - под копейки отдельно.)
 

hermit_refined

Отшельник
Автор оригинала: 440hz
ко мне приходит 1,55 из поля цена. что бы его хранить как int мне его надо умножить на 100.
$a = '1,55';
$price = $a * 100;
Реальность ещё хуже - если $a = '1.13', то intval($price) будет 112 :)

Поэтому у меня либо
PHP:
$price = round(str_replace(',', '.', $a) * 100);
либо (условно)
PHP:
if (!preg_match('@^(\d+)[.,]?(\d\d)?$@', $a, $m))
{
      // форму опять под нос пользователю
}
else
{
      $price = $m[1]*100 + $m[2];
}
 

Skubent

Новичок
И предупреждать пользователя, чтоб все в копейках вводил.
 

baev

‹°°¬•
Команда форума
В американских системах типа HomeBanking оно именно так и реализовано: вводится сумма в центах.

Тут, кстати, забыли про распространённый вариант записи суммы в виде:
$10,000.00
— где запятая разряды разделяет.
 

Линка

Новичок
убирать все символы, кроме цифр



отличная мысль, кстати =)
Если так подумать то в данном случае сталкиваешьcя со следующей "проблемкой":
Пусть есть поле
в него чел вводит цифры
по какомуто событию Javascript
реплэйсит value input'a и если есть не цифры удаляет и
и потом обратно засовывает в поле
Так вот при этом курсор будет всегда становиться в конец выражения что не всегда удобно
Как решение юзать TextRange
 
Сверху