есть string строка, например
string str ="ddadsadwd 1337 dsdggf";
нужно найти в ней число и выписать в переменную int
задан 20 ноя 2016 в 14:07
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 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
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
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;
}
}
Вот пример плохого кода.
12K
18 декабря 2007 года
St0p
59 / / 15.04.2007
Вот пример плохого кода.
Многоуважаемый товарищ) В данном случае я и не претендую) Дело в том, что я знаю, что этот код врятли будет использован вообще кем-либо когда-либо. И не приведи господь, если кому-то он понравится.. Но суть вопроса, имхо, он отображает вполне конкретезировано. Прогнать строку, выцепить понравившийся элемент и вернуть его.) Если чем-то задел — извиняюсь, не специально.)
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
5,1132 gold badges38 silver badges41 bronze badges
asked Jan 19, 2011 at 10:24
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.
answered Jan 19, 2011 at 10:29
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
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
20.3k24 gold badges106 silver badges134 bronze badges
answered Jan 19, 2011 at 10:27
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 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
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
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
answered Aug 30, 2019 at 14:05
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
20.3k24 gold badges106 silver badges134 bronze badges
answered Jan 13, 2013 at 1:25
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
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
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 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
1
You can do this using String
property like below:
return new String(input.Where(Char.IsDigit).ToArray());
which gives only number from string.
answered Dec 15, 2016 at 17:31
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 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
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
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
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
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
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
2,6895 gold badges31 silver badges36 bronze badges
answered May 2, 2018 at 19:53
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
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
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);
answered Jan 11, 2013 at 18:05
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
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
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 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
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
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