|
|
|
[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 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=37756425&tid=1465255]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
179ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 467ms |

| 0 / 0 |
