|
|
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Допустим, пользователь вводит сумму в поле формы, и нам нужно правильно отпарсить введенное им значение. А пользователь может ввести: 1234,56 1234.56 1.234,56 1,234.56 Не надо меня отправлять по ссылке на класс NumberFormatter или типа того, потому что локаль пользователя неизвестна. Или даже если известна, то это ничего не гарантирует. Русский пользователь из США может вводить сумму по-привычке по-русски. А может вообще использовать точку или запятую в зависимости от настроения или фазы луны. Как принято решать данную проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 03:21:17 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
А кто-то прописью введет - не писать же парсер на всех языках. Указать рядом пример, как следует вводить и когда число не соответствует - выдавать ошибку. А не пытаться предусмотреть все фантазии и опечатки пользователя. По поводу локалей - их и не нужно учитывать. Возьми любой онлайн-банкинг той же братинии или нашенский. ВЫВОД - локализованный, ввод - простое число с точкой. Никаких пробелов или, тем более, апострофов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 03:45:46 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Хотя пробелы конечно же не проблема убрать, но сделать это можно во время воода на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 03:46:17 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Edd.Dragon, если заранее определить какие случаи ввода мы хотим обрабатывать то можно сделать чтото типа: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. но тут есть неоднозначности все равно на которые даже человек не ответит точно. например ввели 123,679 - это 123.679 или 123679.00 ? и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 06:24:30 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
чет я о другом подумал, прочитав "парсинг денег". У нас этим правительство занимается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 06:35:05 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Ну вот из-за неоднозначностей и нет смысла угадывать, когда можно указать допустимый вариант и требовать только его. В случае неоднозначности не будешь же выдавать ошибку "Сервер не смог определиться..." =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 06:35:31 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
dresdenчет я о другом подумал, прочитав "парсинг денег". У нас этим правительство занимается. То граббинг, не путай )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 06:35:55 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Если речь идет о прикладных приложениях, то обычно фильтрация, валидация и форматирование осуществляется непосредственно во время ввода данных (хотя форматирование можно делать и по потере фокуса). А если речь идет о веб-приложении, то я бы к полю давал описание формата и проверял бы только соответствие введенных данных ожидаемому формату. Если используются клиентские скрипты, то еще бы при onexit приводил бы по возможности к ожидаемому формату (убрать пробелы, заменить десятичный разделитель). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 09:57:06 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Если речь идет о прикладных приложениях, то обычно фильтрация, валидация и форматирование осуществляется непосредственно во время ввода данных (хотя форматирование можно делать и по потере фокуса). А если речь идет о веб-приложении, то я бы к полю давал описание формата и проверял бы только соответствие введенных данных ожидаемому формату. Если используются клиентские скрипты, то еще бы при onexit приводил бы по возможности к ожидаемому формату (убрать пробелы, заменить десятичный разделитель). необходимо просто через к примеру http://mmcrm.ru/?p=1793 запретить пользователям вводить что либо другое. Пусть вводит текст по маске, и им не надо будет голову ломать как денежку ввести, и вам как прогармистам не надо будет пытаться распрасить строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 10:13:53 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
угу... ещё можно отделить копейки от рублей Код: php 1. 2. на сервере просто склеить с нужным разделителем - клиенту и голову ломать не нужно, что вставлять .\, ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 18:59:22 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Посмотрел как сделали парни в Альфа-Банке: Во-первых, они не допускают присутствия в числе одновременно запятой и точки Во-вторых, в качестве decimal separator допускается и точка и запятая В-третьих, после разделителя допускается только 1 или 2 цифры В-четвертых, для исключения ошибки требуется подтверждение, т.е. типа "Подтвердите сумму перевода: 170.12 usd" По-моему, вполне неплохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 00:02:41 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Вполне авторВо-первых, они не допускают присутствия в числе одновременно запятой и точки А точнее, двух вхождений разделителя. Две точки или две запятые тоже, вроде, не к месту ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 00:05:04 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonВполне авторВо-первых, они не допускают присутствия в числе одновременно запятой и точки А точнее, двух вхождений разделителя. Две точки или две запятые тоже, вроде, не к месту ;) Да, действительно, такой тест я пропустил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 00:13:37 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Вот накатал на скорую руку: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 01:30:22 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Аноним 250, Серверу лучше ожидать стандартного вида, проверяемого одной лишь регуляркой: Код: php 1. с точностью до пробелов перед и после, если перед проверкой делать trim() Т.е. либо только ряд цифр (цело число), либо цифры-точка-цифра-цифра (с копейками). Код: php 1. 2. Вот и вся проверка на сервере. При чем, такая строка является валидным числом как для php, так и для sql-запросов. Ну можно еще серверу разрешить принимать как запятую, так и точку. Тогда просто после трима, перед валидацией меняем запятую на точку. А вот на клиенте реализуй любые желаемые финты. Запятую? Не проблема. Перед отправкой заменишь на точку. Пробелы между цифрами? Аналогично, регуляркой удалишь. И точно так же, при нажатии "Отправить" проверяешь регуляркой на соответствие ДОПУСТИМОМУ шаблону (или нескольким). Не допустимые комбинации сами собой отпадают любые. Впрочем, хочешь - можешь и более разветвленную логику реализовать, но это мартышкин труд, честно говоря. А все те 100 строк серверного кода ни к чему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 01:48:33 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
if(preg_match('/^\d+(\.\d\d)?$/') == 0) Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 01:49:41 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Можно и такую регулярку, чтобы допускать и одну копеечную цифру: Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2012, 01:51:55 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Аноним 250, а почему это вот это фэйл: '987,123,134' Вполне себе валидненькие 987 мульйонов. =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 08:34:43 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:37:17 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Смысл в логику вкладывал следующий. Разделитель тысяч всегда стоит после 3 цифр. Если кто-то написал 1,11,111 - это уже его проблемы - с местными порядками написания чисел, afaik, это нигде не связано. Разделитель тысяч и десятичной части не могут совпадать. Разделитель десятичной части не может повторяться, в отличии от разделителя тысяч. Разделитель тысяч может отсутствовать. Проверяем, что входная строка соответствует этим правилам. Вычленяем во время проверки из неё разделитель тысяч и разделитель десятичной части (может не быть ни того, ни того). Удаляем из строки разделители тысяч, если они есть, так как представление числа (int/float) в php без них. Заменяем разделитель десятичной части на точку, если он уже не точка, по тем же причинам. Если десятичных знаков не передано, удаляем с конца разделитель десятичной части. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:42:55 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Аноним 250, откройте для себя dataProvider в phpunit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:50:08 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
и setExpectedException. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:50:56 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
если хочется чтоб чтоб скрипт жрал все подряд: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 13:25:02 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
r u, не всё подряд, а адекватное всё подряд. Ваш сожрёт 11 1.',1'12 и не подавится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 13:31:16 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
an0nymr u, не всё подряд, а адекватное всё подряд. Ваш сожрёт 11 1.',1'12 и не подавится. ну и пусть) тут значащими являются только цифры и ЛЮБОЙ разделитель целой и дробной части. остальное мусор) можно же потом переспросить юзера, эту сумму он имел в виду или нет. а ваш вариант ошибочную вообще не пропустит, тоесть даже исправлять юзеру отдать нечего. p.s. ваш вариант кстати .08 не съест, хотя так вводить копейки считается вполне допустимым ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 13:38:33 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
r uну и пусть) тут значащими являются только цифры и ЛЮБОЙ разделитель целой и дробной части. остальное мусор) можно же потом переспросить юзера, эту сумму он имел в виду или нет. а ваш вариант ошибочную вообще не пропустит, тоесть даже исправлять юзеру отдать нечего.В моём случае переспрашивать юзера не надо. В вашем случае надо, даже если он ввёл 1234.56 - или надо городить два метода потипу isObviousNumeric и isGuessableNumeric. r up.s. ваш вариант кстати .08 не съест, хотя так вводить копейки считается вполне допустимымЭто легко исправляется. Лучше приведите контр-пример, когда мой метод откровенную чушь пропустит - вот тут я как раз в себе не уверен и жду критики. Самому интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 13:44:55 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
an0nymВ моём случае переспрашивать юзера не надо. как это ненадо? если ваша функция не может переварить какойлибо формат, то явно придется спросить еще раз? а может и не раз an0nymЭто легко исправляется. а когда исправится тогда возможно и другие баги всплывут) чем сложнее реализация тем больше в ней ошибок an0nymЛучше приведите контр-пример, когда мой метод откровенную чушь пропустит - вот тут я как раз в себе не уверен и жду критики. Самому интересно. понимаете, мы с вами по разному подошли к решению. вы пытаетесь склонить юзера к принятому у вас формату, если юзер нехочет(или непонимает) что нужно ввести - то все тупик - функция ваша просто ничего не пропустит. я же пошел по пути другому. мы ждем от юзера сумму - вот пусть ее и вводит, с ЛЮБЫМИ разделителями. он может даже не сам ее набирать а скопировать с ДРУГИХ ИСТОЧНИКОВ (с другого сайта, программы и т.д.). , а там может попасться любой мусор. и моя функция нормализует то что он ввел. может комуто пригодится. по такому принципу я писал парсер для даты, при импорте данных с других систем в мою. формат везде отличался то dd/mm/yyyy то yy.mm.dd то еще как. заставить я никого не мог, формат мог меняться без предупреждения меня. и приходилось ЕСТЬ все эти форматы. а чтоб не парится с каждым я сделал подобную функцию. которая сама определяла в каком формате дата и нормализовывала ее в нужный мне. валилась она только когда ну уж совсем никак нельзя было интерпретировать корректно дату. если будут мысли по вашей функции еще - скажу. пока мыслей нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 14:06:39 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
an0nym, кстати вот: var_dump(parse_number('1234')); // NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 14:14:33 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
r u, (?P<ts>[ ,.]?) ? надо вынести за скобки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 14:22:51 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
r uну и пусть) Вот было бы забавно, если б так думали разработчики онлайн-банкингов. Вводишь по-своему, оно парсит по-своему - финансовые операции, чо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 21:10:44 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
Edd.Dragonr uну и пусть) Вот было бы забавно, если б так думали разработчики онлайн-банкингов. Вводишь по-своему, оно парсит по-своему - финансовые операции, чо! в случаях связанных с фин.операциями все равно всегда спрашивают подтверждения, показывая при этом все реквизиты платежа и сумму. так что все в рамках концепции) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 05:37:48 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
r uEdd.Dragonпропущено... Вот было бы забавно, если б так думали разработчики онлайн-банкингов. Вводишь по-своему, оно парсит по-своему - финансовые операции, чо! в случаях связанных с фин.операциями все равно всегда спрашивают подтверждения, показывая при этом все реквизиты платежа и сумму. так что все в рамках концепции) Ну меж двумя банкингами, один из которых возле поля ввода пишет "Вводите сумму как хотите - разберемся", а другой "Введите число в виде 123456 или 123456.78", я пожалуй выберу второй. А то может у первого вся работа построена по принципу "делай как в голову взбредет - там разберемся", то ну его от греха подальше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 10:05:13 |
|
||
|
[PHP ] Парсинг суммы денег введенной пользователем - best practices?
|
|||
|---|---|---|---|
|
#18+
На самом деле часто не пишут ничего, потом шлют запрос на сервер (не проверяя и не корректируя шаблон на клиенте по месту и ничего не подсказывая), после чего выдают отлуп, что мол запрос некоректен. Вот сиди и угадывай. А в результате окажется, что не раз вводил правильно, просто где-то глюк и суммы с копейками не проходят. Неизвестность для юзера хуже всего. Напишите четко КАК правильно ввести - не мучте юзверей, не окунайте их в море догадок, если хотите, чтобы они пользовались сервисом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 10:09:40 |
|
||
|
|

start [/forum/topic.php?all=1&fid=23&tid=1465255]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 537ms |

| 0 / 0 |
