В файле содержится строка “Число 10 число 20”. Первое число обрабатывается, а на второе выдает стабильно 0. При этом, если выводить только индексы первых элементов чисел в строке (6 и 16) – все работает. В чем может быть проблема?
int main()
{
setlocale(LC_CTYPE, "rus");
string line;
ifstream in("F:\foo.txt");
if (in.is_open())
{
getline(in, line);
}
int digits = line.find_first_of("1234567890");
int digits2 = line.find_last_of("1234567890");
int number = atoi(line.c_str() + digits);
int number2 = atoi(line.c_str() + digits2);
cout << number << endl;
cout << number2 << endl;
in.close();
system("pause");
return 0;
}
задан 24 янв 2020 в 18:01
Итак,
int digits2 = line.find_last_of("1234567890");
Что же мы видим в "Число 10 число 20"
? Точно! Самую распоследнюю цифру – 0 из 20.
int number2 = atoi(line.c_str() + digits2);
Что же тут такое line.c_str() + digits2
? Это строка "0"
Что atoi
должен вернуть для такой строки, как не 0?
И чему вы удивлены? И – с индексами:
Число 10 число 20
1111111
01234567890123456
Все верно, 6 – индекс, с которого начинается 10 число 20, 16 – индекс последнего нуля…
ответ дан 24 янв 2020 в 18:08
HarryHarry
214k15 золотых знаков117 серебряных знаков228 бронзовых знаков
При этом, если выводить только индексы первых элементов чисел в строке (6 и 16) – все работает
Вы совершенно правильно заметили, что второй индекс равен 16. А теперь посмотрите, на какой символ он указывает
Число 10 число 20
^^^^^^^^^^^^^^^^^
1111111
01234567890123456
Т.е. digits2
указывает на последнюю цифру в строке. Что как бы логично. Строка
int digits2 = line.find_last_of("1234567890");
находит последнее вхождение цифры.
Чтобы программа работала, вам нужно сместиться влево от digits2
на начало числа
ответ дан 24 янв 2020 в 18:11
Anton ShchyrovAnton Shchyrov
32.9k2 золотых знака29 серебряных знаков59 бронзовых знаков
Алгоритм решения: (предлагаю Вам переписать Ваш вариант)
1) Разбить строки на лексемы через stringstream
2) проверить цифры или нет
3) обработать (сделать то, что Вам нужно)
Вместо файла будет просто строка(представим что Вы туда сдампили файл) Вот Вам 2 схожих метода как это сделать
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <cctype>
#include <iterator>
void foo(std::string str) {
std::cout << "first" << std::endl;
std::stringstream ss{ str };
std::string tmp{};
std::vector<int64_t> data_v;
while (ss >> tmp) {
if (std::all_of(std::begin(tmp), std::end(tmp), std::isdigit)) {
data_v.push_back(std::stoi(tmp));
}
}
for (const auto& v : data_v) {
std::cout << v << std::endl;
}
}
void foo2(std::string str) {
std::cout << "second" << std::endl;
std::stringstream ss(str);
std::istream_iterator<std::string> begin(ss), end;
std::vector<std::string> vec_str(begin, end);
std::vector<int> data_v;
auto f{ [&](const std::string& s) { if (std::count_if(std::begin(s), std::end(s), std::isdigit) == s.size()) { data_v.push_back(std::atoi(s.c_str())); }} };
std::for_each(std::begin(vec_str), std::end(vec_str), f);
for (const auto& v : data_v) {
std::cout << v << std::endl;
}
}
int main() {
std::string str{ "num 10 num 20" };
foo(str);
foo2(str);
return 0;
}
ответ дан 24 янв 2020 в 20:13
Oh-Ben-BenOh-Ben-Ben
1,4921 золотой знак6 серебряных знаков12 бронзовых знаков
6
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,1032 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,2431 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
174k35 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
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
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
8268 silver badges20 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 badges30 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
2 / 2 / 0 Регистрация: 05.12.2013 Сообщений: 316 |
|
1 |
|
Найти числа в строке18.06.2019, 15:02. Показов 25878. Ответов 13
Добрый день! Пишу небольшую программу и появилась необходимость найти в строке с текстом найти числа и вывести их в label. Всё бы было просто, если бы цифры имели всегда одинаковую длину, то я бы их просто вырезал Substring, но нет каждый раз числа могу быть разных размеров, допустим, пример строк:
0 |
Immo 692 / 509 / 238 Регистрация: 02.10.2012 Сообщений: 1,737 |
||||
18.06.2019, 15:18 |
2 |
|||
0 |
Rbhbkk-00 4 / 3 / 1 Регистрация: 11.04.2016 Сообщений: 13 |
||||
18.06.2019, 15:19 |
3 |
|||
0 |
2 / 2 / 0 Регистрация: 05.12.2013 Сообщений: 316 |
|
18.06.2019, 15:23 [ТС] |
4 |
Immo, а как можно каждое отдельное число записать в отдельный label?
0 |
Immo 692 / 509 / 238 Регистрация: 02.10.2012 Сообщений: 1,737 |
||||||||
18.06.2019, 15:36 |
5 |
|||||||
Добавлено через 2 минуты
2 |
2 / 2 / 0 Регистрация: 05.12.2013 Сообщений: 316 |
|
18.06.2019, 16:10 [ТС] |
6 |
Immo, Клёво, действительно работает, только я забыл указать, что в конце строки ставится rn и оно не видит последнее число. И также подскажите, пожалуйста, что означает @”^d+$?
0 |
Элд Хасп Модератор 13766 / 9982 / 2657 Регистрация: 21.04.2018 Сообщений: 29,728 Записей в блоге: 2 |
||||||||
18.06.2019, 16:19 |
7 |
|||||||
только я забыл указать, что в конце строки ставится rn и оно не видит последнее число
Добавлено через 2 минуты
1 |
2 / 2 / 0 Регистрация: 05.12.2013 Сообщений: 316 |
|
18.06.2019, 16:28 [ТС] |
8 |
Элд Хасп, подскажите, пожалуйста, а где взять out int _tmp?
0 |
Элд Хасп Модератор 13766 / 9982 / 2657 Регистрация: 21.04.2018 Сообщений: 29,728 Записей в блоге: 2 |
||||
18.06.2019, 16:35 |
9 |
|||
подскажите, пожалуйста, а где взять out int _tmp? Нигде. Это временная переменная. Необходима для работы метода Добавлено через 2 минуты
0 |
2727 / 1644 / 869 Регистрация: 14.04.2015 Сообщений: 5,609 |
|
18.06.2019, 16:35 |
10 |
MAKC13, нигде, там же скобка только лишняя. в этом месте _tmp)))
0 |
Diamante 3457 / 2464 / 1170 Регистрация: 14.08.2016 Сообщений: 8,158 |
||||
18.06.2019, 16:36 |
11 |
|||
на выходе массив чисел
0 |
2 / 2 / 0 Регистрация: 05.12.2013 Сообщений: 316 |
|
18.06.2019, 16:40 [ТС] |
12 |
Элд Хасп, всё равно ругается на int _tmp, пишет будто бы нет такой переменной.
0 |
Diamante 3457 / 2464 / 1170 Регистрация: 14.08.2016 Сообщений: 8,158 |
||||
18.06.2019, 16:54 |
13 |
|||
Сообщение было отмечено MAKC13 как решение Решениелибо используй fw 4.5+, либо
0 |
Модератор 13766 / 9982 / 2657 Регистрация: 21.04.2018 Сообщений: 29,728 Записей в блоге: 2 |
|
18.06.2019, 17:14 |
14 |
ругается на int _tmp, пишет будто бы нет такой переменной.
Добавлено через 1 минуту
1 |
Как найти все цифры в строке?
В этой небольшой заметке я хочу показать Вам, как можно легко найти цифры в строке. Данная задача очень часто встречается при парсинге текста, проверке полей ввода и некоторых других задачах. Поэтому было бы не плохо, если бы всегда под рукой было готовое решение.
И так, предположим, что нам дана строка, которая содержит следующий текст: 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
Здравствуйте , подскажите есть ли метод для С++, который бы считывал построчно цифры из текстового файла. Или подскажите как это реализовать. Буду благодарен
Пример
10
1 5 6 8
3 4
4 2 0 3 4 7 9
Причем надо в разные массивы запихнуть цифры из строк
-
Вопрос заданболее трёх лет назад
-
10960 просмотров
Почитайте вот здесь – stackoverflow.com/questions/9673708/tell-cin-to-st…
А именно следующий код:
std::string line;
std::getline(cin, line);
std::istringstream iss(line);
while (iss >> c) {
vec.push_back(c);
}
Объект istringstream инициализируется строкой, и позволяет работать с ней как с потоком.
P.S. Не забудьте подключить sstream
Я не очень хорошо понял вашего вопроса.
Если файл дан в таком виде:
0 1 2 3 4
5 6 7 8 9
….
То можно использовать потоковый ввод.
ifstream file("fileName");
int number;
...
file >> number;
Но, возможно, я вас неправильно понял.
Пригласить эксперта
-
Показать ещё
Загружается…
19 мая 2023, в 14:17
20000 руб./за проект
19 мая 2023, в 14:02
100000 руб./за проект
11 мая 2023, в 16:20
1500 руб./в час