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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выкинуть буквы из строки, было: Требуется помощь (не смеяться) 
V
    Опции темы
KuZyagroup
Дата 5.6.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



В старом добром паскале можно так

Код

case myString[i] of
'1'..'9','0' : doSmth();
else doSmthElse();
End;


Шарп разумеется не поддерживает аналогичную конструкцию

Код

switch (Phone.Substring(0,1))
{
       case '1'..'9','0':
               break;
       default:
               break;
}


Вопрос: Как реализовать такую выборку и есть ли какие то способы легче и практичней реализовать мою задачу.
Задача: Есть запись из букв и цыфр - перевсти в запись только из цыфр выкинув буквы.

 ! 
Дрон
Я переименовал тему. На будущее следуй правилам -- вроде и не новичок уже на форуме.


Это сообщение отредактировал(а) Дрон - 5.6.2007, 09:05
PM MAIL   Вверх
SpaceSpace
Дата 5.6.2007, 09:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




подключи пространство

Код

using System.Text.RegularExpressions;       

используй регулярные выражения
Код

// это исходная строка - цывры + буквы
string sa = "kjb45k6blkhwglvlc53034";
// регулярное выражение - "брать только цыфры"
Regex REG = new Regex("[0-9]+");
// ищем совпадения в исходной строке
MatchCollection mc = REG.Matches(sa);

StringBuilder sb = new StringBuilder();
// создаем строку результата
foreach (Match matc in mc)
    sb.Append(matc.Value);
// а это твой результат - только цифры
string onlyDigits = sb.ToString();



--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
darkness
Дата 5.6.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 5.8.2006
Где: Москва

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



Цитата

Есть запись из букв и цыфр - перевсти в запись только из цыфр выкинув буквы.


А не проще ли регуляками реализовать?

Что-то наподобие:
Код

using System.Text.RegularExpression;

string shabl="[0-9]+";   //сам что ни наесть шаблон говорящий, что ему нужны только цифры 
// 

MatchCollection match = Regex.Matches("ТВОЯ_СТРОКА", shabl);  // приводим твою строку к шаблону

string sum;
foreach(Match m in match)   //match содержит все строковые совпадения котрые были найдены...
{
   sum+=m.Value;   // а теперь просто совпадения "суммируем"
}


(код писал без студии в синтаксисе возможны ошибки)

Добавлено через 1 минуту и 43 секунды
SpaceSpace,   smile  !

чего-то я слегка припоздал smile !

Добавлено через 6 минут и 39 секунд
Ещё отмечу что код SpaceSpace является более правильным с точки зрения экономии памяти и вского такого, так как задействован StringBuilder, который в отличие от string не создает новый экземпляр при добавленни строк, а добавляет у же к существущей строки 
Код

sb.Append(matc.Value);

--------------------
Вина каких стран Вы предпочитаете в это время суток?     (Булгаков. "Мастер и Маргарита") 
PM MAIL   Вверх
SpaceSpace
Дата 5.6.2007, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно еще упростить(одной строчкой меньше), если использовать статический метод Regex.Matches

Код

// это исходная строка - цыфры + буквы
string sa = "kjb45k6blkhwglvlc53034";

// ищем совпадения в исходной строке
MatchCollection mc = Regex.Matches(sa,"[0-9]+");

StringBuilder sb = new StringBuilder();
// создаем строку результата
foreach (Match matc in mc)
    sb.Append(matc.Value);

// а это твой результат - только цифры
string onlyDigits = sb.ToString();


Это сообщение отредактировал(а) SpaceSpace - 5.6.2007, 09:24


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Gelis
Дата 5.6.2007, 09:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

if(Char.IsDigit(Phone.Subxtring(0,1))
{
}
else
{
}

PM MAIL   Вверх
KuZyagroup
Дата 5.6.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



Вот метод который я использовал
Код

private string phoneFormate(string Phone)
{
       string st = string.Empty;            
       while (Phone.Length > 0)
       {
                string c = Phone.Substring(0, 1);                
                for (int i = 0; i<10; i++)                
                    if (c == i.ToString())
                    {
                        st = st + c;
                        break;
                    }                
                Phone = Phone.Substring(1);
        }
}


П.С. Всем, спаситбо за помощь, сейчас буду думать какой из них оставить (свой или ваш)

Добавлено через 5 минут и 35 секунд
2Gelis,  Спасибо
Цитата

if(Char.IsDigit(Phone.Subxtring(0,1))

как раз то что доктор прописал. Теперь кода 4 строчки и он вполне читабелел ))))

Код

            string st = string.Empty;            
            while (Phone.Length > 0)
            {              
                if (Char.IsDigit(Phone,0))  st = st + Phone.Substring(0, 1);
                Phone = Phone.Substring(1);
            }


PM MAIL   Вверх
SpaceSpace
Дата 5.6.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




по примеру Gelis
Код

// это исходная строка - цыфры + буквы
string sa = "kjb45k6blkhwglvlc53034";

            StringBuilder sb = new StringBuilder();
            foreach(Char ch in sa)
                if(Char.IsDigit(ch))
                {
                    sb.Append(ch);
                }

            // а это твой результат - только цифры
           string onlyDigits = sb.ToString();


Цитата

П.С. Всем, спаситбо за помощь, сейчас буду думать какой из них оставить (свой или ваш) 

Даже не думай так делать,
это ОЧЕНЬ плохой код,
он, если честно, просто ужасен
у тебя на каждый символ - 10 циклов проверки,

самый быстрый способ - регулярные выражения (при небольших текстах)


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
KuZyagroup
Дата 5.6.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



Всё проблема решена  smile 
дальше  smile

Добавлено через 2 минуты и 41 секунду
Цитата

Даже не думай так делать,
это ОЧЕНЬ плохой код,
он, если честно, просто ужасен
у тебя на каждый символ - 10 циклов проверки,

самый быстрый способ - регулярные выражения (при небольших текстах)


Я уже проверяю char.IsDigit См. выше ;)
PM MAIL   Вверх
SpaceSpace
Дата 5.6.2007, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

как раз то что доктор прописал. Теперь кода 4 строчки и он вполне читабелел ))))


ну а тут на каждый символ 
абсолютно левая операция
Код

Phone = Phone.Substring(1);

и соответствененая ей проверка
Код

while (Phone.Length > 0)


НЕ ДЕЛАЙ ТАК!


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
darkness
Дата 5.6.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 5.8.2006
Где: Москва

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



ИМХО, регулярки надёжнее
--------------------
Вина каких стран Вы предпочитаете в это время суток?     (Булгаков. "Мастер и Маргарита") 
PM MAIL   Вверх
KuZyagroup
Дата 5.6.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



Цитата

ну а тут на каждый символ 
абсолютно левая операция


А ты код регулярок видел, мне очень кажеться что они кажды символ тоже проверяют

Вот листинг с убиением одной левой операции

Код

         for (int i=0;i<Phone.Length;i++)
            {                
                if (Char.IsDigit(Phone,i))  st = st + Phone.Substring(i, 1);                
            }

PM MAIL   Вверх
SpaceSpace
Дата 5.6.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А ты код регулярок видел, мне очень кажеться что они кажды символ тоже проверяют

видел, сам делал

Регулярки суть есть конечный автомат, машина тьюринга, 
учи матчасть

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

Цитата

Вот листинг с убиением одной левой операции

у тебя используется прямая конкатенация строк string1+string2,
если ты не знаеш, то это сильно засирает память, т.к. для каждой операции сложения
строки создается НОВАЯ строка,
вместо
Цитата

st = st + Phone.Substring(i, 1);  

используй
StringBuilder, как было показано выше

Это сообщение отредактировал(а) SpaceSpace - 5.6.2007, 10:08


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
KuZyagroup
Дата 5.6.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



SpaceSpace
Код

private string phoneFormate(string Phone)
{
            StringBuilder sbSt = new StringBuilder();            
            for (int i=0;i<Phone.Length;i++)                            
                if (Char.IsDigit(Phone,i))  sbSt.Append(Phone.Substring(i, 1));

            return sbSt.ToString();
}

Хочешь сказать - вот так я сэкономлю памяти - если так спасиб огромное. У меня эта ф-ция до 5-тысяч раз вызывается.
PM MAIL   Вверх
SpaceSpace
Дата 5.6.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



использовать StringBuilder
НАДО всегда,
если строка будет изменяться

в твоем случае - в любом случае

Добавлено через 3 минуты и 34 секунды
если не хочешь юзать регулярки,
все-равно мой пример лучше

Код

private string phoneFormate(string Phone)
{
            StringBuilder sbSt = new StringBuilder();            
            foreach(Char ch in sa)
                if(Char.IsDigit(ch))
                {
                    sbSt.Append(ch);
                }
            return sbSt.ToString();
}


т.к. у тебя происходит дополнительная обработка строки
Код

Phone.Substring(i, 1)

на каждом шаге


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
KuZyagroup
Дата 5.6.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



SpaceSpace
А foteach-eм точно порядок не нарушиться - а то обибно будет - я как ни какак телефоные номера копирую
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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