![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Гость_Elena |
|
|||
|
Unregistered |
Пишу на учебном уровне некую программу(JSP), которая конвертирует одну валюту в другую.
В английской системе десятичные отделяются от целых точкой, а во французской запятой. Сервер JSP работает с цифрами в английской ситеме. Если изобразить из английской во французской, проблемы нет:
Теперь, мне нужно считать значение из текстового поля, куда юзер вводит денежную сумму во французской системе, которую он хочет конвертировать. Причем, мне надо проверить во французской ли системе введена сумма, если нет выдать error page с указаниями делать ввод во французской системе. Если же ввод сделан правильно, нужно считать данные в английскую систему для произведения расчетов. Тут и есть загвозка: От юзера я получаю String, по идее я должна сделать parseDouble(String s), но для меня абсолютная загадка, как это сделать в нужной локальной системе? Думаю, что идея поменять запятые на точки на уровне стринга, это - не то. Как обычно решаются подобные проблемы. Подскажите, пожалуйста, хотя бы алгоритм. Заранее благодарна, Елена |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
У NumberFormat есть метод Number parse(String), который позволяет преобразовать строку в число в соответствии с текущими региональными установками.
И еще есть класс DecimalFormatSymbols, в котором описанны все символы используемые для форматирования чисел. Добавлено @ 16:32 Чуть не забыл Elena, зарегистрируйтесь и приходите к нам почаще!!! Велкам -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Гость_Elena |
|
||||||||
|
Unregistered |
Большое спасибо. У меня есть еще одна жуткая проблема:
Юзер выбирает методом select страны, названия которых берутся из текстового файла на французском языке. В кодировке для фр. яз <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> буковки с аксантами передаются специальными кодами. Собственно, чтоб было понятно, сам текстовый файл со странами:
É - означает É, é - é. Все это я загоняю в массив из объектов, созданного мною класса Деньги (Argent(String abreviature, String argentPays, double valeur;)) Теперь юзер выбирает 2 страны в селекте (из валюты которой в валюту которой), и в виде стринговых переменных эти названия передаются на другую страницу JSP, где уже, в зависимости от выбранного, происходят различные расчеты и выдается ответ. Считываю переменные:
Теперь мне нужно выловить индексы объектов:
В случае с аксантами не работает. Добавляю под считыванием переменных:
Опять не работает, и в чем проблема собершенно не представляю. А как-то надо сделать, чтобы заработало. P.S.: Спасибо, за приглашение зарегистрироваться, обещаю сделать это в ближайшее будущее. |
||||||||
|
|||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я честно говоря не особенно разбираюсь в JSP, поэтому не совсем хорошо понял проблему, можно описать проблему поподробнее (тем боле что как я понял она не связанна с особенностями JSP). Единственное что я заметил, это то что String сраниваются ==, а не equals().
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Elene |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
В данном случае, это не Strings, как String, а members определенного класса, к которым есть доступ только через определенные функции типа getMember() поэтому стравнение типа == в данном случае не работает, работает только equals() (Это чистая Джава). Проблема не в этом.
Попытаюсь объяснить по-подробнее... Селект выглядит следующим образом:
а - это массив объектов выше упомянутого класса Деньги. a[c].getArgPays() - дает среднию колонку из текстового файла, где как раз a[1].getArgPays() - это "Dollars - Étas-Unis", а a[5].getArgPays() - это "Reais - Brésil". В коде НТМL, это тоже выглядит аналогично:
На экране мы видим "Dollars - Étas-Unis" и "Reais - Brésil". Теперь надо передать selected option с одной страницы на другую нажатием кнопки, это все стандартно, как при обработке любой НТМL формы. Я передаю значение "de". Смотрю, что получается в случае с США и с Бразилией:
Смотрю на экран, вижу "Dollars - Étas-Unis". Открываю код НТМL и опять вижу: de = Dollars - Étas-Unis<br> Все "É" не передались, передались "É", хотя все кодировки те же. А сранивать мне надо с "Dollars - Étas-Unis" из текстового файла. Причем, эти "É" как-то так очень хитро передаются, что получается что "É", которая передалась не распознается, как "É", которую я печатаю для сравнения. Мне смутно помнится, что в PHP, например, существуют какие-то хидеры (header) для encoding при пересылке данных. Существует ли что-то такое в JSP? А, главное, как узнать, что передается на самом деле на уровне Java, и почему не распознаются эти переданные буквы с аксантами. |
||||||
|
|||||||
| Elene |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Спасибо, проблема решена. Оказывается нужно было пойти с .equals() до конца и использовать вместо
вот это:
только, вот, не понятно почему, ведь de это как бы String, а не объект. Или я ошибаюсь... Поясните, пожалуйста, хочется в механизме разобраться |
||||
|
|||||
| Zandr |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Да все как-бы просто - есть примитивы: boolean, byte, char, short, int, long, float, double - в переменных этих типов хранятся собственно значения. Например:
В a будет лежать 5. String, Integer, Object, StringBuffer, JPanel, и т.д. и т.п. - классы.
В s будет лежать не строка "abcdef", а адрес этой строки в памяти компьютера. Если вы делаете еще одну строку
str будет содержать адрес этой новой строки, который не совпадает с адресом предыдущей, поэтому следующий код
сравнивает не содержимое этих строк, а их адреса. Метод же equals делает как раз то что вам нужно. Виновником этой путаницы со строками является "усовершенствование" языка, позволяющее в некоторых случаях работать со строками как с примитивами:
Это сообщение отредактировал(а) Zandr - 27.9.2004, 08:23 |
||||||||||
|
|||||||||||
| Elene |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Cпасибо, что-то смутно начинает проясняться в голове.
Скажите, мне еще, пожалуйста, а что конкретно получается на уровне адресов значений, когда я в начале страницы запрашиваю то, что я прислала с другой. (valeur по-французски = value по-английски):
Проблема в том, что этот String valeurInp у меня не парсится. Я уже стала на уровне интеджера проверять, не парсится и все тут. Что-то я опять не то делаю. Парсю я так:
Выдается следующая ошибка:
|
||||||
|
|||||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
должно быть если я правильно понял... На какой именно строке ошибка вылетает? Одинаковы ли имена в коде и в HTML (нет ли очепяток)? Это сообщение отредактировал(а) Zandr - 27.9.2004, 12:27 |
|||
|
||||
| Elene |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Спасибо. Действиетльно, где-то очепяталась. Переписала, стало работать.
Это моя первая программа на JSP, и Java у меня еще только в процессе изучения. Вот бы еще научиться дубль по-французски запарсивать. Насколько я понимаю, в данном случае французский вариант эквивалентен русскому, может кто-то это уже делал... У NumberFormat я не нашла метод Number parse(String), который позволяет преобразовать строку в число в соответствии с текущими региональными установками. Там есть только parse(String source) Parses text from the beginning of the given string to produce a number. , и parse(String source, ParsePosition parsePosition) Returns a Long if possible (e.g., within the range [Long.MIN_VALUE, Long.MAX_VALUE] and with no decimals), otherwise a Double. , и parseObject(String source, ParsePosition pos) Parses text from a string to produce a Number. |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Zandr правильно написал, что String это объекты и соответсвенно оператор == сравнивает не строки а ссылки на объекты. Но есть одно но, в Java String это особые объекты. Для строк есть такое понятие как пул, это место где находятся все строки которые заданны литералами и константами или помещены туда принудительно. И тогда для двух любых строк из пула оператор == и метод s.equals() возвращают одно и тоже значение. Т.е. объекты не дублируются а используются уже существующие. Для вашего случая код можно было переписать так:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| Гость_Elena |
|
|||
|
Unregistered |
A mogno po-podrobnee. Chto takoe intern(), chto konkretno on delaet s adresami ili so znacheniami, chto vozvrschaet i k kakomy klassy otnositsa. Nikogda o nem ne slishala.
(Izvinite za otsytstvie cirillic) |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я ошибся в коде, надо было:
intern() это метод String, который проверяет есть ли уже такая строка в пуле строк, и если она там есть, то возвращает ссылку на строку из пула, если нет то помещает ее туда. Таким образом можно избежать дублирования строк, и заменить equals() на ==. Т.е. s1.intern() == s2.intern() истина, тогда и только тогда когда s1.equals(s2) истина. Константанты и строки заданные непосредственно в коде программы помещаются в пул автоматически. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Гость_Elene |
|
|||
|
Unregistered |
Spasibo, teper' poniatno
|
|||
|
||||
| Elene |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Ура!!! Я его(ее) добила!!!
(Вдруг, кому-то тоже пригодится - |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |