Как в символьной строке найти число

есть string строка, например

string str ="ddadsadwd 1337 dsdggf";

нужно найти в ней число и выписать в переменную int

задан 20 ноя 2016 в 14:07

topl3niy's user avatar

5

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

#include <iostream>
#include <algorithm>
#include <cctype>
#include <cstdlib>

int main() 
{
    std::string str ="ddadsadwd 1337 dsdggf";
    int n = 0;

    auto it = std::find_if( str.begin(), str.end(), isdigit );

    if ( it != str.end() ) n = std::atoi( str.c_str() + ( it - str.begin() ) );

    std::cout << n << std::endl;

    return 0;
}

Вывод программы на консоль

1337

При этом предполагается, что число в строке не содержит знак. Иначе вам придется использовать другой предикат в алгоритме std::find_if, который также будет делать проверку на знак числа.

ответ дан 20 ноя 2016 в 14:28

Vlad from Moscow's user avatar

Vlad from MoscowVlad from Moscow

44.7k3 золотых знака37 серебряных знаков89 бронзовых знаков

5

#include <iostream>
#include <string>
#include <cstdlib>

int main(void)
{
    std::string s ="ddadsadwd 1337 dsdggf";
    size_t digits = s.find_first_of( "1234567890+-" );
    if( digits <= s.size() ) {
        std::cout << "Number found: " << atoi( s.c_str() + digits ) << std::endl;
    }
    else {
        std::cout << "Number is not found" << std::endl;
    }
    return 0;
}

ответ дан 20 ноя 2016 в 17:16

PinkTux's user avatar

PinkTuxPinkTux

9,05613 серебряных знаков26 бронзовых знаков

Вариант с regex:

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main() {
    string s = "ddadsadwd 1337 dsdggf";
    regex p("\d+");
    regex_token_iterator<string::iterator> numbers( s.begin(), s.end(), p );
    string t = *numbers;
    int first_number = atoi( t.c_str() );
    cout << first_number << endl;
    return 0;
}

P.S. Почему не работает (*numbers).c_str()?

ответ дан 20 ноя 2016 в 15:41

pank's user avatar

pankpank

2,5481 золотой знак14 серебряных знаков30 бронзовых знаков

19 ответов

397

17 декабря 2007 года

SergPas

527 / / 03.02.2007

Только путём посимвольного анализа строки.

12K

18 декабря 2007 года

St0p

59 / / 15.04.2007

for(i=0; i<n; i++)//n — длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str — стока, z — искомое число
{
y=z;
}
}
всё. Теперь возвращаешь y и его место под солнцем.

397

18 декабря 2007 года

SergPas

527 / / 03.02.2007

Цитата:

for(i=0; i<n; i++)//n — длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str — стока, z — искомое число
{
y=z;
}
}

Вот пример плохого кода. :eek:

12K

18 декабря 2007 года

St0p

59 / / 15.04.2007

Вот пример плохого кода. :eek:

Многоуважаемый товарищ) В данном случае я и не претендую) Дело в том, что я знаю, что этот код врятли будет использован вообще кем-либо когда-либо. И не приведи господь, если кому-то он понравится.. Но суть вопроса, имхо, он отображает вполне конкретезировано. Прогнать строку, выцепить понравившийся элемент и вернуть его.) Если чем-то задел — извиняюсь, не специально.)

255

18 декабря 2007 года

Dart Bobr

1.4K / / 09.04.2004

Уважаемый, начнем с того, что данный код просто не рабочий.
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом ‘3’, к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.

З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?

13K

18 декабря 2007 года

specter

113 / / 28.09.2007

строка задана как char, в ней есть буквы, разные знаки + какое-либо целое число.
например PEREMENNAYA=124
подскажите, как из такой строки выделить число в отдельную переменную?

Тут удобнее всего будет использовать регулярные выражения ;)

6.4K

18 декабря 2007 года

Host

122 / / 22.09.2005

…подскажите, как из такой строки выделить число в отдельную переменную?

Код:

[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] NumberFromString([/SIZE][SIZE=2][COLOR=#0000ff]const [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]char[/COLOR][/SIZE][SIZE=2]* szTestString)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i<strlen(szTestString); i++)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]   if[/COLOR][/SIZE][SIZE=2](isdigit(szTestString))[/SIZE]
[SIZE=2]   {[/SIZE]
[SIZE=2][COLOR=#0000ff]      return[/COLOR][/SIZE][SIZE=2] atoi(&szTestString);[/SIZE]
[SIZE=2]   }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] -1;[/SIZE]
[SIZE=2]}[/SIZE]

12K

18 декабря 2007 года

St0p

59 / / 15.04.2007

Уважаемый, начнем с того, что данный код просто не рабочий.
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом ‘3’, к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.

З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?

Согласен, виноват, испарвлюсь) Убидили)

32K

20 декабря 2007 года

Mayachok

5 / / 17.12.2007

спасибо всем. с помощью регулярок сделаю (вот только надо будет подучиться с ними работать)

538

21 декабря 2007 года

AVDEY

188 / / 17.11.2005

Вот как я использовал перевод строки в числовой тип double:

Код:

double StringDouble(CString Sstr)
{

char cBuf;
double ret=0,iDrob=1,iDrobBuf=1;
int iSize=0,iMeter=0,iCile=10,iZnak=1;

iSize=Sstr.GetLength();
if(iSize==0)return 0;
if((Sstr.GetAt(0))==’-‘)
{iZnak=-1;iMeter++;}
while(iMeter<iSize)
        {

cBuf=Sstr.GetAt(iMeter);
iDrob=iDrob*iDrobBuf;

           
    switch(cBuf)
    {
        case ‘.’:{iCile=1;iDrobBuf=0.1;}break;
        case ‘0’:ret=ret*iCile+0*iDrob;break;
        case ‘1’:ret=ret*iCile+1*iDrob;break;
        case ‘2’:ret=ret*iCile+2*iDrob;break;
        case ‘3’:ret=ret*iCile+3*iDrob;break;
        case ‘4’:ret=ret*iCile+4*iDrob;break;
        case ‘5’:ret=ret*iCile+5*iDrob;break;
        case ‘6’:ret=ret*iCile+6*iDrob;break;
        case ‘7’:ret=ret*iCile+7*iDrob;break;
        case ‘8’:ret=ret*iCile+8*iDrob;break;
        case ‘9’:ret=ret*iCile+9*iDrob;break;

   
    }
iMeter++;}
ret=ret*iZnak;

return ret;
}

Но это было сделано только для того случая, когда заранее известно что строка содержит только цифровые символы, иначе эта функция просто сложит все цифровые символы в одну цифру.
Если я правильно понял вопрос думаю что подойдет,если дописать:

Код:

switch(…)
{
case 0:{}break;
//………………………….
//………………………….
//………………………….
 default: {ret=ret*iZnak; return ret;}
}

32K

24 декабря 2007 года

Mayachok

5 / / 17.12.2007

возможно ли сделать это без регулярных выражений?
в строке присутствуют не только цифры, но и символы. причем какое чилсо будет в строке — неизвестно. как раз его и надо найти

1.6K

24 декабря 2007 года

Vov4ick

476 / / 01.02.2007

Примерно такой алгоритм:
Проходим строку посимвольно, пока не встретим конец строки, либо пока не встретим символ ( char >=’0′ && char <=’9′ ). Если конец строки — выход.
Если символ встретили, записываем в конец пустой строки пока. Далее проходим оставшуюся часть строки пока ( char >=’0′ && char <=’9′ ).
Далее sprintf() с нужными параметрами.
В случае чисел с плав. запятой в оба сравнения добавляется проверка на запятую или точку.
При необходимости разбора массива повторяем до встречиконца строки.

3

24 декабря 2007 года

Green

4.8K / / 20.01.2000

Вот как я использовал перевод строки в числовой тип double:

Код:

switch(cBuf)
    {
        case ‘.’:{iCile=1;iDrobBuf=0.1;}break;
        case ‘0’:ret=ret*iCile+0*iDrob;break;
        case ‘1’:ret=ret*iCile+1*iDrob;break;
        case ‘2’:ret=ret*iCile+2*iDrob;break;
        case ‘3’:ret=ret*iCile+3*iDrob;break;
        case ‘4’:ret=ret*iCile+4*iDrob;break;
        case ‘5’:ret=ret*iCile+5*iDrob;break;
        case ‘6’:ret=ret*iCile+6*iDrob;break;
        case ‘7’:ret=ret*iCile+7*iDrob;break;
        case ‘8’:ret=ret*iCile+8*iDrob;break;
        case ‘9’:ret=ret*iCile+9*iDrob;break;

   
    }

Жуть… :)
Хорошо, что цифр всего 10. :D:D

353

24 декабря 2007 года

Nixus

840 / / 04.01.2007

Код:

#include <stdio.h>

int getNum(const char* szStr)
{
    int outNum = 0;
    int bNum = 0;
    const char *p = szStr;

    while(*p)
    {
        if(*p >= ‘0’ && *p <= ‘9’)
        {
            bNum = 1;
            outNum = outNum* 10 + (*p — ‘0’);
        }
        else
        {
            if(bNum)
                break;
        }

        p++;
    }

    return outNum;
}

main()
{
    printf(«%in», getNum(«qwe=123wer»));
    printf(«%in», getNum(«gkwehrkjhwekt679012wer»));
    printf(«%in», getNum(«qwkehqwkjeg64897126498qwr»));
}

538

24 декабря 2007 года

AVDEY

188 / / 17.11.2005

Жуть… :)
Хорошо, что цифр всего 10. :D:D

А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.

3

24 декабря 2007 года

Green

4.8K / / 20.01.2000

А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.

А зачем сравнивать все символы?
Для того, чтоб определить, что символ является цифрой, достаточно сделать такую проверку:

Код:

а для того, чтоб определить, какой цифрой является символ достаточно произвести такое действие:

Код:

Т.о. твой гигантский switch вырождается в следущее:

Код:

if(ch == ‘.’) {
        …..
    } else {
        unsigned int val = ch — ‘0’;
        if(val <= 9) {
            …..
        }
    }

Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.

353

25 декабря 2007 года

Nixus

840 / / 04.01.2007

Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.

А еще луше два целых для хранения целой и дробной части отдельно и последующего перевода.

32K

25 декабря 2007 года

Mayachok

5 / / 17.12.2007

сделала вот так вот:

int NumberFromString(const char* szTestString)
{
for(int i = 0; i<strlen(szTestString); i++)
{
if(isdigit(szTestString))
{
return atoi(&szTestString);
}
}
}

работает как надо и занимает мало места :)

538

25 декабря 2007 года

AVDEY

188 / / 17.11.2005

Спасибо за предложенные варианты, переделаю функцию, а то ту функцию я писал когда еще был на втором или на первом курсе института. И как то не было обходимости чтото изменять.

I have a requirement to find and extract a number contained within a string.

For example, from these strings:

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"

How can I do this?

David Sopko's user avatar

David Sopko

5,1132 gold badges38 silver badges41 bronze badges

asked Jan 19, 2011 at 10:24

van's user avatar

7

d+ is the regex for an integer number. So

//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"d+").Value;

returns a string containing the first occurrence of a number in subjectString.

Int32.Parse(resultString) will then give you the number.

Mehdi Dehghani's user avatar

answered Jan 19, 2011 at 10:29

Tim Pietzcker's user avatar

Tim PietzckerTim Pietzcker

326k58 gold badges499 silver badges558 bronze badges

16

Here’s how I cleanse phone numbers to get the digits only:

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());

answered Mar 27, 2013 at 21:07

Dave's user avatar

DaveDave

3,2631 gold badge17 silver badges15 bronze badges

3

go through the string and use Char.IsDigit

string a = "str123";
string b = string.Empty;
int val;

for (int i=0; i< a.Length; i++)
{
    if (Char.IsDigit(a[i]))
        b += a[i];
}

if (b.Length>0)
    val = int.Parse(b);

Danny Beckett's user avatar

Danny Beckett

20.3k24 gold badges106 silver badges134 bronze badges

answered Jan 19, 2011 at 10:27

Sasha Reminnyi's user avatar

Sasha ReminnyiSasha Reminnyi

3,4222 gold badges23 silver badges27 bronze badges

6

use regular expression …

Regex re = new Regex(@"d+");
Match m = re.Match("test 66");

if (m.Success)
{
    Console.WriteLine(string.Format("RegEx found " + m.Value + " at position " + m.Index.ToString()));
}
else
{
    Console.WriteLine("You didn't enter a string containing a number!");
}

answered Jan 19, 2011 at 10:27

Pranay Rana's user avatar

Pranay RanaPranay Rana

175k35 gold badges237 silver badges263 bronze badges

0

What I use to get Phone Numbers without any punctuation…

var phone = "(787) 763-6511";

string.Join("", phone.ToCharArray().Where(Char.IsDigit));

// result: 7877636511

answered Jan 16, 2015 at 14:55

ejcortes's user avatar

ejcortesejcortes

6097 silver badges13 bronze badges

0

Regex.Split can extract numbers from strings. You get all the numbers that are found in a string.

string input = "There are 4 numbers in this string: 40, 30, and 10.";
// Split on one or more non-digit characters.
string[] numbers = Regex.Split(input, @"D+");
foreach (string value in numbers)
{
    if (!string.IsNullOrEmpty(value))
    {
    int i = int.Parse(value);
    Console.WriteLine("Number: {0}", i);
    }
}

Output:

Number: 4
Number: 40
Number: 30
Number: 10

answered Oct 15, 2013 at 20:11

Tabares's user avatar

TabaresTabares

4,0435 gold badges40 silver badges46 bronze badges

1

if the number has a decimal points, you can use below

using System;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //Your code goes here
            Console.WriteLine(Regex.Match("anything 876.8 anything", @"d+.*d*").Value);
            Console.WriteLine(Regex.Match("anything 876 anything", @"d+.*d*").Value);
            Console.WriteLine(Regex.Match("$876435", @"d+.*d*").Value);
            Console.WriteLine(Regex.Match("$876.435", @"d+.*d*").Value);
        }
    }
}

results :

«anything 876.8 anything» ==> 876.8

«anything 876 anything» ==> 876

«$876435» ==> 876435

«$876.435» ==> 876.435

Sample : https://dotnetfiddle.net/IrtqVt

Community's user avatar

answered Aug 30, 2019 at 14:05

Tarek El-Mallah's user avatar

Tarek El-MallahTarek El-Mallah

3,9801 gold badge31 silver badges46 bronze badges

2

Here’s a Linq version:

string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));

Danny Beckett's user avatar

Danny Beckett

20.3k24 gold badges106 silver badges134 bronze badges

answered Jan 13, 2013 at 1:25

spajce's user avatar

spajcespajce

7,0165 gold badges29 silver badges44 bronze badges

2

Another simple solution using Regex
You should need to use this

using System.Text.RegularExpressions;

and the code is

string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"d", "");
string mynumber = Regex.Replace(var, @"D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);

answered Jan 18, 2014 at 11:03

1

You can also try this

string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\d]"));

answered Jan 19, 2011 at 10:27

BvdVen's user avatar

BvdVenBvdVen

2,90123 silver badges33 bronze badges

1

Here is another Linq approach which extracts the first number out of a string.

string input = "123 foo 456";
int result = 0;
bool success = int.TryParse(new string(input
                     .SkipWhile(x => !char.IsDigit(x))
                     .TakeWhile(x => char.IsDigit(x))
                     .ToArray()), out result);

Examples:

string input = "123 foo 456"; // 123
string input = "foo 456";     // 456
string input = "123 foo";     // 123

answered Sep 28, 2016 at 6:35

fubo's user avatar

fubofubo

44.6k17 gold badges102 silver badges136 bronze badges

Just use a RegEx to match the string, then convert:

Match match = Regex.Match(test , @"(d+)");
if (match.Success) {
   return int.Parse(match.Groups[1].Value);
}

answered Jan 19, 2011 at 10:29

Daniel Gehriger's user avatar

Daniel GehrigerDaniel Gehriger

7,3192 gold badges33 silver badges55 bronze badges

 string input = "Hello 20, I am 30 and he is 40";
 var numbers = Regex.Matches(input, @"d+").OfType<Match>().Select(m => int.Parse(m.Value)).ToArray();

answered Aug 18, 2017 at 18:08

Ramireddy Ambati's user avatar

1

You can do this using String property like below:

 return new String(input.Where(Char.IsDigit).ToArray()); 

which gives only number from string.

Rahul Hendawe's user avatar

answered Dec 15, 2016 at 17:31

Shyam sundar shah's user avatar

For those who want decimal number from a string with Regex in TWO line:

decimal result = 0;
decimal.TryParse(Regex.Match(s, @"d+").Value, out result);

Same thing applys to float, long, etc…

answered Oct 5, 2016 at 3:19

Richard Fu's user avatar

Richard FuRichard Fu

5968 silver badges27 bronze badges

Here is another simple solution using Linq which extracts only the numeric values from a string.

var numbers = string.Concat(stringInput.Where(char.IsNumber));

Example:

var numbers = string.Concat("(787) 763-6511".Where(char.IsNumber));

Gives: «7877636511»

answered Apr 11, 2022 at 14:08

Bloggrammer's user avatar

BloggrammerBloggrammer

8368 silver badges20 bronze badges

var match=Regex.Match(@"a99b",@"d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}

answered Jan 19, 2011 at 10:29

spender's user avatar

spenderspender

117k33 gold badges227 silver badges346 bronze badges

The question doesn’t explicitly state that you just want the characters 0 to 9 but it wouldn’t be a stretch to believe that is true from your example set and comments. So here is the code that does that.

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

Why you don’t want to use Char.IsDigit() — Numbers include characters such as fractions, subscripts, superscripts, Roman numerals, currency numerators, encircled numbers, and script-specific digits.

answered Jan 18, 2015 at 18:26

Atters's user avatar

AttersAtters

8018 silver badges19 bronze badges

var outputString = String.Join("", inputString.Where(Char.IsDigit));

Get all numbers in the string.
So if you use for examaple ‘1 plus 2′ it will get ’12’.

answered Sep 16, 2015 at 14:21

Tom's user avatar

TomTom

1391 silver badge14 bronze badges

Extension method to get all positive numbers contained in a string:

    public static List<long> Numbers(this string str)
    {
        var nums = new List<long>();
        var start = -1;
        for (int i = 0; i < str.Length; i++)
        {
            if (start < 0 && Char.IsDigit(str[i]))
            {
                start = i;
            }
            else if (start >= 0 && !Char.IsDigit(str[i]))
            {
                nums.Add(long.Parse(str.Substring(start, i - start)));
                start = -1;
            }
        }
        if (start >= 0)
            nums.Add(long.Parse(str.Substring(start, str.Length - start)));
        return nums;
    }

If you want negative numbers as well simply modify this code to handle the minus sign (-)

Given this input:

"I was born in 1989, 27 years ago from now (2016)"

The resulting numbers list will be:

[1989, 27, 2016]

answered May 24, 2016 at 19:08

Thomas C. G. de Vilhena's user avatar

An interesting approach is provided here by Ahmad Mageed, uses Regex and StringBuilder to extract the integers in the order in which they appear in the string.

An example using Regex.Split based on the post by Ahmad Mageed is as follows:

var dateText = "MARCH-14-Tue";
string splitPattern = @"[^d]";
string[] result = Regex.Split(dateText, splitPattern);
var finalresult = string.Join("", result.Where(e => !String.IsNullOrEmpty(e)));
int DayDateInt = 0;

int.TryParse(finalresult, out DayDateInt);

d219's user avatar

d219

2,6895 gold badges31 silver badges36 bronze badges

answered May 2, 2018 at 19:53

Simba's user avatar

SimbaSimba

4795 silver badges7 bronze badges

I have used this one-liner to pull all numbers from any string.

var phoneNumber = "(555)123-4567";
var numsOnly = string.Join("", new Regex("[0-9]").Matches(phoneNumber)); // 5551234567

answered Mar 20, 2021 at 2:30

Reed's user avatar

ReedReed

1,4851 gold badge21 silver badges37 bronze badges

3

  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }

answered Feb 27, 2013 at 5:56

Manoj Gupta's user avatar

2

Did the reverse of one of the answers to this question:
How to remove numbers from string using Regex.Replace?

// Pull out only the numbers from the string using LINQ

var numbersFromString = new String(input.Where(x => x >= '0' && x <= '9').ToArray());

var numericVal = Int32.Parse(numbersFromString);

Community's user avatar

answered Jan 11, 2013 at 18:05

mwilly's user avatar

0

Here is my Algorithm

    //Fast, C Language friendly
    public static int GetNumber(string Text)
    {
        int val = 0;
        for(int i = 0; i < Text.Length; i++)
        {
            char c = Text[i];
            if (c >= '0' && c <= '9')
            {
                val *= 10;
                //(ASCII code reference)
                val += c - 48;
            }
        }
        return val;
    }

answered Oct 11, 2018 at 9:25

HS_Kernel's user avatar

static string GetdigitFromString(string str)
    {
        char[] refArray = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] inputArray = str.ToCharArray();
        string ext = string.Empty;
        foreach (char item in inputArray)
        {
            if (refArray.Contains(item))
            {
                ext += item.ToString();
            }
        }
        return ext;
    }

answered Jan 13, 2013 at 0:43

Ruby Beginner's user avatar

1

here is my solution

string var = "Hello345wor705Ld";
string alpha = string.Empty;
string numer = string.Empty;
foreach (char str in var)
{
    if (char.IsDigit(str))
        numer += str.ToString();
    else
        alpha += str.ToString();
}
Console.WriteLine("String is: " + alpha);
Console.WriteLine("Numeric character is: " + numer);
Console.Read();

answered Jan 18, 2014 at 10:39

You will have to use Regex as d+

d matches digits in the given string.

answered Jan 19, 2011 at 10:28

Sachin Shanbhag's user avatar

Sachin ShanbhagSachin Shanbhag

54.1k11 gold badges88 silver badges103 bronze badges

string s = "kg g L000145.50rn";
        char theCharacter = '.';
        var getNumbers = (from t in s
                          where char.IsDigit(t) || t.Equals(theCharacter)
                          select t).ToArray();
        var _str = string.Empty;
        foreach (var item in getNumbers)
        {
            _str += item.ToString();
        }
        double _dou = Convert.ToDouble(_str);
        MessageBox.Show(_dou.ToString("#,##0.00"));

answered Jan 19, 2016 at 7:25

watcharachai unvijit's user avatar

Using @tim-pietzcker answer from above, the following will work for PowerShell.

PS C:> $str = '1 test'
PS C:> [regex]::match($str,'d+').value
1

answered Feb 19, 2019 at 20:45

user2320464's user avatar

user2320464user2320464

3611 gold badge5 silver badges11 bronze badges

Число

Автор artm81, 09 мая 2012, 20:15

0 Пользователей и 1 гость просматривают эту тему.

Подскажите,пожалуйста, как в переменной типа СТРОКА найти символ, тип которого ЧИСЛО. Например,  Строка = » В этой строке найти число 5″ . (Вот при обходе этой строки посимвольно нужно узнать,когда дойдём до 5). Спасибо!


Ну, например вот так:
   строка = «8 В эт3ой стр4оке найти число 5»;
   ДлинаСтроки = СтрДлина(строка);
   Для i=1 По ДлинаСтроки Цикл
      СимКод = КодСимвола(строка, i);
      Если СимКод > 47 И СимКод < 58 Тогда
         Сообщить(«Цифра в позиции строки N » + i)
      КонецЕсли;
   КонецЦикла;


А есть другой способ не по КодСимвола?


Да
1. через массив чисел
2. Регулярные выражения

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


Есть не по КодСимвола

Строка = » В этой строке найти число 5″;
Для поз=1 По СтрДлина(Строка) Цикл
      Символ = Сред(строка, поз, 1);
      Если Символ >= «0» И Символ <= «9» Тогда
         Сообщить(«Цифра в позиции строки N » + поз)
      КонецЕсли;
КонецЦикла;

как-то так. Если не секрет зачем такие загибы?

если помогло нажмите: Спасибо!


Интересно как отработает
Если «1» >= «0» И «1» <= «9» Тогда ???????

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


Еще как вариант
Строка = » В этой строке найти число 5″;
Для поз=1 По СтрДлина(Строка) Цикл
      Символ = Сред(строка, поз, 1);
      Попытка
            Ч = Число(Символ);
            Сообщить(«В строке есть число = «+Ч);
      Исключение
      КонецПопытки;

        КонецЦикла;

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


Через попытку не Айс…

Процедура КнопкаВыполнитьНажатие(Кнопка)

   SearchOfNumbers(» В этой строке найти число 5″);

   КонецПроцедуры

Функция SearchOfNumbers(val str)

       RegExp = Новый COMObject(«VBScript.RegExp»);
   RegExp.IgnoreCase = false;  //Игнорировать регистр
   RegExp.Global = true;       //Поиск всех вхождений шаблона
   RegExp.MultiLine = true;    //Многострочный режим    

       RegExp.Pattern = «d+»;
   Matches=RegExp.Execute(str);
   Count = Matches.Count();
   if Count > 0 then  
      for h = 0 to Count — 1 do
           message(Matches.Item(h).Value);
       enddo;
   endif;              

         КонецФункции   

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!



Ну такой вариант более правильный.
На выходе ты получишь из строки: «сколько 567 тут 54 чисел 7» //Тут три числа, а не шесть
= 567
= 54
= 7

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


Как найти все цифры в строке?

В этой небольшой заметке я хочу показать Вам, как можно легко найти цифры в строке. Данная задача очень часто встречается при парсинге текста, проверке полей ввода и некоторых других задачах. Поэтому было бы не плохо, если бы всегда под рукой было готовое решение.

И так, предположим, что нам дана строка, которая содержит следующий текст: T2$Z562k#Ca8*U50w1%Cc3. Поместим это значение в переменную string value.

Задача:

1. Найти все цифры в строке.
2. Вывести полученный результат в элемент управления listbox.

Пример 1.

В первом примере решим задачу с помощью метода Where, который осуществит фильтрацию последовательности значений с помощью простого лямбда выражения, после чего полученный результат мы преобразуем в список и поместим в элемент управления listBox.

listBox1.DataSource = value.Where(x => x > 47 & x  58).ToList();

Результат

найденные цифры

Если Вы не знаете, почему в данном примере используется диапазон чисел от 47 до 58, то советую прочитать статью: Как получить все буквы алфавита, в который Вы найдете подробное объяснение.

Пример 2.

Во втором примере, для того чтобы найти все цифры в строке, мы воспользуемся методом isDigit класса Char, который по переданному в него символу позволяет определить, цифра это или нет.

listBox1.DataSource = value.Where(x => Char.IsDigit(x)).ToList();

Выполняем код и получаем тот же самый результат.

Читайте также:

  • Как выгрузить данные из базы данных Mysql в XML?
  • Как получить сумму элементов массива в языке c#
  • Создание и добавление узлов в элементе TreeView


Понравилась статья? Поделить с друзьями:
  • Как найти программу chkdsk
  • Как найти страну своей мечты
  • Неполадки в посудомоечной машине bosch как исправить
  • Потерял телефон самсунг как можно его найти
  • Как найти неизвестную сторону прямоугольника зная площадь