Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Типы String и StringBuilder, Вопрос чисто теоретический 
:(
    Опции темы
Cybernetic10
Дата 11.8.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Была задача: перевести строку типа (String)"0.123456" в Double.
Появилась ошибка: неправильный формат. Я не сразу сообразил, что все дело в точке, как оказалось, шарп принимает в качестве разделителя в Double запятую. Пробовал применить метод Replace(char, char). Строка остается без изменений. Ну правильно, тип String константный. Чтобы обойти эту проблему, писал:
Код

StringBuilder temp = new StringBuilder(str);
str = temp.Replace('.', ',').ToString();

Собсно, вопрос. Зачем в константном типе есть методы-преобразователи? Или я что-то неправильно делаю, и можно обойти проблему более простым способом, не создавая новый объект? И можно ли решить данную проблему как-нить по другому, опять же эффектнее и эффективнее? smile
PM MAIL   Вверх
Partizan
Дата 11.8.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



чтобы поменять строку, не создавая новый объект, нужно использовать  StringBuilder, так что в этом плане всё правильно...

что касается самого решения проблемы - можно вызвать double.TryParse и одним из параметров указать культуру для строки "0.123456"


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
diadiavova
Дата 11.8.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Partizan @  11.8.2009,  12:26 Найти цитируемый пост)
одним из параметров указать культуру для строки "0.123456" 

Маленькое уточнение: для числовых форматов лучше использовать не культуру, а 
System.Globalization.NumberFormatInfo
Цитата(Cybernetic10 @  11.8.2009,  10:27 Найти цитируемый пост)
Я не сразу сообразил, что все дело в точке, как оказалось, шарп принимает в качестве разделителя в Double запятую.

Что он принимает по-умолчанию зависит от настройки системы. В аглецкай винде как раз всё наоборот.
Цитата(Cybernetic10 @  11.8.2009,  10:27 Найти цитируемый пост)
Пробовал применить метод Replace(char, char). Строка остается без изменений. 

Метод реплэйс не меняет саму строку, он возвращает новую со всеми изменениями. То есть надо писать не так
Код

str.Replace('.', ',');

а к примеру так
Код

str2 = str.Replace('.', ',');

или так
Код

str = str.Replace('.', ',');


Это сообщение отредактировал(а) diadiavova - 11.8.2009, 13:36


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Cybernetic10
Дата 11.8.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Цитата(diadiavova @  11.8.2009,  13:34 Найти цитируемый пост)
или так
Код

str = str.Replace('.', ',');


Я в итоге так сделал, спасибо smile

Цитата(diadiavova @  11.8.2009,  13:34 Найти цитируемый пост)

Что он принимает по-умолчанию зависит от настройки системы. В аглецкай винде как раз всё наоборот.

Получается, что программа будет зависеть от настроек системы? А как добиться универсальности? 

Цитата(diadiavova @  11.8.2009,  13:34 Найти цитируемый пост)

System.Globalization.NumberFormatInfo

Я пытался использовать этот типа в перегруженном методе Double.Parse, для обработки точки в качестве разделителя AllowDecimalPoint(правильно?), но ошибка о неправильном формате все равно присутствует. Что делаю не так?
PM MAIL   Вверх
diadiavova
Дата 11.8.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Cybernetic10 @  11.8.2009,  15:17 Найти цитируемый пост)
AllowDecimalPoint(правильно?)

 smile  NumberDecimalSeparator


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Cybernetic10
Дата 11.8.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Цитата(diadiavova @ 11.8.2009,  14:18)
 smile  NumberDecimalSeparator

Все, разобрался с культурами. Просто раньше не работал с ними =)

Код

String str = "0.123456";
System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US").NumberFormat;
Double dValue = Double.Parse(str, nfi);


А вот как использовать System.Globalization.NumberFormatInfo и NumberDecimalSeparator я не понял :(
Поможете? smile

Это сообщение отредактировал(а) Cybernetic10 - 11.8.2009, 15:52
PM MAIL   Вверх
diadiavova
Дата 11.8.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Можно и так
Код

String str = "0.123456";
var nfi = new System.Globalization.NumberFormatInfo();
nf.NumberDecimalSeparator = ".";
Double dValue = Double.Parse(str, nfi);



Это сообщение отредактировал(а) diadiavova - 11.8.2009, 15:55


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0718 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.