Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Преобразование буквенного символа в цифру

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Специальные условия для калькулятора
Эдвард
Отправлено: 20 Сентября, 2014 - 19:01:58
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Дано:

Простейший калькулятор на JavaScript: http://med-75[dot]hol[dot]es/1/5[dot]html .

Код:

CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <meta charset="utf-8">
  3.  
  4. <head>
  5.  
  6. <script type="text/javascript">
  7.  
  8. function calculator(form) {
  9.  
  10. r1 = form.r1.value;
  11. n1 = form.n1.value;
  12. n2 = form.n2.value;
  13.  
  14. x1 = r1;
  15.  
  16. switch (x1)
  17. {      
  18. case "сложение" : a1=(n1-0)+(n2-0); break;
  19. case "вычетание" : a1=n1-n2; break;
  20. case "умножение" : a1=n1*n2; break;
  21. }
  22. form.total.value = a1;
  23. }
  24.  
  25. </script>
  26. </head>
  27.  
  28. <form name="f1">
  29.  
  30. <select name="r1">
  31.  <option>сложение</option>
  32.  <option>вычетание</option>
  33.  <option>умножение</option>
  34. </select> <input name="n1" type="text" size="25" align="center"> <input name="n2" type="text" size="25" align="center"> <input type="button" value="Калькуляция" onClick="calculator(this.form)"> <input name="total" type="text" size="25" align="center">
  35.  
  36. </form>
  37. </html>


Требуется:

При введении в окна ввода конкретного буквенного символа (например, буквы «Р»), для математических операций воспринимать его, как конкретную цифру (например, 0). (В данный момент введение любых символов, кроме числовых, приводит к результату NaN)

Возможно ли такое сделать на JavaScript? Если да, прошу помочь подсказкой. Заранее благодарю за помощь.
 
 Top
dcc0
Отправлено: 20 Сентября, 2014 - 23:28:10
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Т.е. у вас будет однозначное соответствие между цифрами и буквами?
Т.е. ключ -> значение
P -> 0
A - > 10
etc.
Если да, то в JS наличествуют массивы.
http://learn[dot]javascript[dot]ru/array


-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 00:59:36
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




dcc0 пишет:
Т.е. у вас будет однозначное соответствие между цифрами и буквами?
Т.е. ключ -> значение
P -> 0
A - > 10
etc.
Если да, то в JS наличествуют массивы.
http://learn.javascript.ru/array


Не понимаю, как реализовать свою задачу через массив. Подчеркну: для меня важно, чтобы одна конкретная буква участвовала в математических операциях, как число, но после выполнения команды оставалась той же буквой в окне ввода.
 
 Top
dcc0
Отправлено: 21 Сентября, 2014 - 10:23:23
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <script type="text/javascript">
  3. var p = 1;
  4. alert(p+2);
  5. </script>

http://learn[dot]javascript[dot]ru/types-intro
http://learn[dot]javascript[dot]ru/types-conversion
(Добавление)
Поисковик моментально ответил
CODE (htmlphp):
скопировать код в буфер обмена
  1. if (isNaN(n)) {alert('не число');}


Код для теста:

Спойлер (Отобразить)

(Добавление)
Если у вас n1 и n2 могут содержать и числа, и буквы:
http://www[dot]cyberforum[dot]ru/javascr[dot][dot][dot]hread227121[dot]html
Тема в достаточной мере раскрывает суть вопроса.

(Отредактировано автором: 21 Сентября, 2014 - 11:36:52)



-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 12:21:10
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Большое спасибо! Это именно то, что мне было нужно.
 
 Top
dcc0
Отправлено: 21 Сентября, 2014 - 12:27:29
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Желательно четко детерминировать формат ввода.
Если вы вводите, допустим, в поля так:

то можете делать замену по регулярному выражению, чтобы сохранить вычислимость остальных чисел:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.     if (isNaN(n1))  {
  3. var re = /p/;
  4. var n1;
  5. var n1 = n1.replace(re, "0");
  6. }
  7.  
  8.     if (isNaN(n2))  {
  9. var re = /p/;
  10. var n2;
  11. var n2 = n2.replace(re, "0");
  12. }
  13.  


http://javascript[dot]ru/string/replace

(Отредактировано автором: 21 Сентября, 2014 - 12:50:29)



-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 13:14:02
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Возьму на вооружение этот пример. Но пока основная задача по данному моменту выполнена. Сильно усложнять код тоже не хотелось бы, т. к. калькулятор, над которым работаю, будет совершать операции не с двумя ячейками, а с шестьюдесятью. К тому же, одной и той же функцией скрипт должен вычислить сумму числовых значений (исключая буквенные) и количество букв (исключая числа). И если первая задача сейчас понятна, то со второй предстоит помучиться: http://med-75[dot]hol[dot]es/1/6[dot]html .

CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <meta charset="utf-8">
  3.  
  4. <head>
  5.  
  6. <script type="text/javascript">
  7.  
  8. function calculator(form) {
  9.  
  10.  
  11. r1 = form.r1.value;
  12. n1 = form.n1.value;
  13. n2 = form.n2.value;
  14. n3 = form.n3.value;
  15. n4 = form.n4.value;
  16.  
  17. x1 = r1;
  18.  
  19. if (isNaN(n1))
  20. var n1 = 0;
  21.  
  22. if (isNaN(n2))
  23. var n2 = 0;
  24.  
  25. if (isNaN(n3))
  26. var n3 = 0;
  27.  
  28. if (isNaN(n4))
  29. var n4 = 0;
  30.  
  31. switch (x1)
  32. {      
  33. case "+" : a1=(n1*1)+(n2*1)+(n3*1)+(n4*1); break;
  34. default:  a1="";
  35. }
  36. form.total1.value = a1;
  37.  
  38.  
  39. }
  40.  
  41. </script>
  42. </head>
  43.  
  44. <form name="f1">
  45.  
  46. <select name="r1">
  47.  <option>+</option>
  48. </select> <input name="n1" type="text" size="5" align="center"> <input name="n2" type="text" size="5" align="center"><input name="n3" type="text" size="5" align="center"> <input name="n4" type="text" size="5" align="center">
  49. <br>
  50. <input type="button" value="Калькуляция" onClick="calculator(this.form)">
  51. <br>
  52. <input name="total1" type="text" size="5" align="center">
  53. <input name="total2" type="text" size="5" align="center">
  54.  
  55. </form>
  56. </html>


По замыслу, во втором результирующем окне должно отобразиться количество ячеек, в которые были введены нечисловые символы.
 
 Top
dcc0
Отправлено: 21 Сентября, 2014 - 13:32:22
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Так и есть.


-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 19:54:08
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




А вот для более сложной задачи (когда значения "инпутов" заведомо заданы и внесены в условие), такая конструкция уже не работает: http://med-75[dot]hol[dot]es/1/7[dot]html .

CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <meta charset="utf-8">
  3.  
  4. <head>
  5.  
  6. <script type="text/javascript">
  7.  
  8. function calculator(form) {
  9.  
  10.  
  11. r1 = form.r1.value;
  12. n1 = form.n1.value;
  13. n2 = form.n2.value;
  14. n3 = form.n3.value;
  15. n4 = form.n4.value;
  16.  
  17. x1 = r1;
  18.  
  19. if (isNaN(n1))
  20. var n1 = 0;
  21.  
  22. if (isNaN(n2))
  23. var n2 = 0;
  24.  
  25. if (isNaN(n3))
  26. var n3 = 0;
  27.  
  28. if (isNaN(n4))
  29. var n4 = 0;
  30.  
  31. switch (x1)
  32. {      
  33. case "1+2+3+4" : a1=1; a2=2; a3=3; a4=4; break;
  34. case "Р+2+3+4" : a1="Р"; a2=2; a3=3; a4=4; break;
  35. case "1+Р+3+4" : a1=1; a2="Р"; a3=3; a4=4; break;
  36. case "1+2+Р+4" : a1=1; a2=2; a3="Р"; a4=4; break;
  37. case "1+2+3+Р" : a1=1; a2=2; a3=3; a4="Р"; break;
  38. default:  a1=""; a2=""; a3=""; a4="";
  39. }
  40.  
  41. b1=a1+a2+a3+a4
  42.  
  43. form.n1.value = a1;
  44. form.n2.value = a2;
  45. form.n3.value = a3;
  46. form.n4.value = a4;
  47. form.total1.value = b1;
  48. }
  49.  
  50. </script>
  51. </head>
  52.  
  53. <form name="f1">
  54.  
  55. <select name="r1">
  56.  <option>1+2+3+4</option>
  57.  <option>Р+2+3+4</option>
  58.  <option>1+Р+3+4</option>
  59.  <option>1+2+Р+4</option>
  60.  <option>1+2+3+Р</option>
  61.  </select> <input name="n1" type="text" size="5" align="center"> <input name="n2" type="text" size="5" align="center"><input name="n3" type="text" size="5" align="center"> <input name="n4" type="text" size="5" align="center">
  62. <br>
  63. <input type="button" value="Калькуляция" onClick="calculator(this.form)">
  64. <br>
  65. <input name="total1" type="text" size="5" align="center">
  66. <input name="total2" type="text" size="5" align="center">
  67.  
  68. </form>
  69. </html>


Интересно, имеется ли какой-то способ в данной ситуации представить букву "Р" в виде цифры 0?

(Отредактировано автором: 21 Сентября, 2014 - 19:55:25)

 
 Top
dcc0
Отправлено: 21 Сентября, 2014 - 20:26:56
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




(Добавление)
Уже хотел было посоветовать перечитать мой пример выше с регулярным выражением, но тут все совсем просто:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. case "1+2+3+4" : a1=1; a2=2; a3=3; a4=4; break;
  4.  
  5. case "Р+2+3+4" : a1=0; a2=2; a3=3; a4=4; break;
  6.  
  7. case "1+Р+3+4" : a1=1; a2=0; a3=3; a4=4; break;
  8.  
  9. case "1+2+Р+4" : a1=1; a2=2; a3=0; a4=4; break;
  10.  
  11. case "1+2+3+Р" : a1=1; a2=2; a3=3; a4=0; break;
  12.  
  13. default:  a1=""; a2=""; a3=""; a4="";
  14.  

Т.е. "P" в условии не имеет смысла.

(Отредактировано автором: 21 Сентября, 2014 - 20:27:44)



-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 20:32:27
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




dcc0 пишет:
тут все совсем просто


Если б... Выше я уже писал о том, что необходимо сохранять в ячейках оригинальные значения (в т. ч. буквенные), а заменять буквы на числа (в частности Р на 0) лишь при вычислениях.

(Отредактировано автором: 21 Сентября, 2014 - 20:32:56)

 
 Top
dcc0
Отправлено: 21 Сентября, 2014 - 21:25:24
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




В лоб данная проблема решается так же просто, логически. Будет считать сумму и выводить P независимо о от того, в какой позиции P. Я написал для двух. Может быть, это можно как-то более элегантно оформить, написав функцию, чтобы не повторять код. Суть такая: проверить, что в переменной, вычислить, установить ту переменную, где был 0 заново, т.е. вернуть ей значение P, возвратить результат.

Спойлер (Отобразить)

(Отредактировано автором: 21 Сентября, 2014 - 22:49:03)



-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 22:02:36
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Интересную мысль подсказали: не Р менять на 0, а 0 – на Р. Спасибо. Сам, скорее, не догадался бы.

Записал сейчас так:

CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <meta charset="utf-8">
  3.  
  4. <head>
  5.  
  6. <script type="text/javascript">
  7.  
  8. function calculator(form) {
  9.  
  10.  
  11. r1 = form.r1.value;
  12. n1 = form.n1.value;
  13. n2 = form.n2.value;
  14. n3 = form.n3.value;
  15. n4 = form.n4.value;
  16.  
  17. x1 = r1;
  18.  
  19. switch (x1)
  20. {      
  21. case "1+2+3+4" : a1=1; a2=2; a3=3; a4=4; break;
  22. case "Р+2+3+4" : a1=0; a2=2; a3=3; a4=4; break;
  23. case "1+Р+3+4" : a1=1; a2=0; a3=3; a4=4; break;
  24. case "1+2+Р+4" : a1=1; a2=2; a3=0; a4=4; break;
  25. case "1+2+3+Р" : a1=1; a2=2; a3=3; a4=0; break;
  26. default:  a1=""; a2=""; a3=""; a4="";
  27. }
  28. b1=a1+a2+a3+a4;
  29.  
  30. if (a1==0) {
  31. var a1 = "Р";
  32. }
  33.  
  34. if (a2==0) {
  35. var a2 = "Р";
  36. }
  37.  
  38. if (a3==0) {
  39. var a3 = "Р";
  40. }
  41.  
  42. if (a4==0) {
  43. var a4 = "Р";
  44. }
  45.  
  46. form.n1.value = a1;
  47. form.n2.value = a2;
  48. form.n3.value = a3;
  49. form.n4.value = a4;
  50. form.total1.value = b1;
  51.  
  52. }
  53.  
  54. </script>
  55. </head>
  56.  
  57. <form name="f1">
  58.  
  59. <select name="r1">
  60.  <option>1+2+3+4</option>
  61.  <option>Р+2+3+4</option>
  62.  <option>1+Р+3+4</option>
  63.  <option>1+2+Р+4</option>
  64.  <option>1+2+3+Р</option>
  65.  </select> <input name="n1" type="text" size="5" align="center"> <input name="n2" type="text" size="5" align="center"><input name="n3" type="text" size="5" align="center"> <input name="n4" type="text" size="5" align="center">
  66. <br>
  67. <input type="button" value="Калькуляция" onClick="calculator(this.form)">
  68. <br>
  69. <input name="total1" type="text" size="5" align="center">
  70. <input name="total2" type="text" size="5" align="center">
  71.  
  72. </form>
  73. </html>


Вроде работает.
 
 Top
dcc0
Отправлено: 21 Сентября, 2014 - 23:08:33
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Вопрос только в том, как вы организуете код, когда у вас будет 60 полей.


-----
Март 2021. Бросил программирование
 
 Top
Эдвард
Отправлено: 21 Сентября, 2014 - 23:10:12
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




dcc0 пишет:
Вопрос только в том, как вы организуете код, когда у вас будет 60 полей.


Может, можно через switch?..
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB