ฉันมีความต้องการในการค้นหาและแยกจำนวนที่มีอยู่ในสตริง
ตัวอย่างเช่นจากสตริงเหล่านี้:
string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
ฉันจะทำสิ่งนี้ได้อย่างไร
1.5
อย่างไร สัญลักษณ์เลขชี้กำลังเป็น1.5E45
อย่างไร
ฉันมีความต้องการในการค้นหาและแยกจำนวนที่มีอยู่ในสตริง
ตัวอย่างเช่นจากสตริงเหล่านี้:
string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
ฉันจะทำสิ่งนี้ได้อย่างไร
1.5
อย่างไร สัญลักษณ์เลขชี้กำลังเป็น1.5E45
อย่างไร
คำตอบ:
ผ่านสตริงและใช้ 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);
b == "System.Linq.Enumerable.."
คือ ถูกต้อง (และง่ายยิ่งขึ้น) จะเป็นb = String.Join("", a.Where(char.IsDigit))
new string(char[])
สร้าง
\d+
เป็น regex สำหรับจำนวนเต็ม ดังนั้น
//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;
subjectString
ส่งกลับสตริงที่มีเกิดขึ้นครั้งแรกของตัวเลขใน
Int32.Parse(resultString)
จะให้หมายเลข
Regex.Match(subjectString, @"-?\d+").Value
แทนได้
นี่คือวิธีที่ฉันทำความสะอาดหมายเลขโทรศัพท์เพื่อให้ได้ตัวเลขเท่านั้น:
string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
ใช้นิพจน์ปกติ ...
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!");
}
สิ่งที่ฉันใช้เพื่อรับหมายเลขโทรศัพท์โดยไม่มีเครื่องหมายวรรคตอน ...
var phone = "(787) 763-6511";
string.Join("", phone.ToCharArray().Where(Char.IsDigit));
// result: 7877636511
Regex.Split สามารถดึงตัวเลขจากสตริง คุณได้รับตัวเลขทั้งหมดที่พบในสตริง
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);
}
}
เอาท์พุท:
หมายเลข: 4 จำนวน: 40 จำนวน: 30 จำนวน: 10
นี่คือLinq
รุ่น:
string s = "123iuow45ss";
var getNumbers = (from t in s
where char.IsDigit(t)
select t).ToArray();
Console.WriteLine(new string(getNumbers));
"123iuow45ss".AsEnumerable().Where(char.IsDigit)
อะไร
from t .. select t
ความซ้ำซ้อน แต่อย่างไรก็ตามเสียงเชียร์
อีกวิธีง่ายๆในการใช้ Regex คุณควรจะต้องใช้สิ่งนี้
using System.Text.RegularExpressions;
และรหัสคือ
string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);
คุณสามารถลองสิ่งนี้ได้
string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
เพียงใช้ RegEx เพื่อจับคู่สตริงจากนั้นแปลง:
Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
return int.Parse(match.Groups[1].Value);
}
นี่คือLinq
วิธีการอื่นที่แยกหมายเลขแรกออกจากสตริง
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);
ตัวอย่าง:
string input = "123 foo 456"; // 123
string input = "foo 456"; // 456
string input = "123 foo"; // 123
สำหรับผู้ที่ต้องการตัวเลขทศนิยมจากสตริงที่มีRegexในสองบรรทัด:
decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);
สิ่งเดียวกัน applys จะลอย , ยาว , ฯลฯ ...
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();
คุณสามารถทำได้โดยใช้String
คุณสมบัติเช่นด้านล่าง:
return new String(input.Where(Char.IsDigit).ToArray());
ซึ่งให้ตัวเลขจากสตริงเท่านั้น
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
int val;
if(int.TryParse(match.Value,out val))
{
//val is set
}
}
คำถามไม่ได้ระบุอย่างชัดเจนว่าคุณเพียงแค่ต้องการตัวละครที่ 0 ถึง 9 แต่ก็ไม่น่าเชื่อว่าจะเป็นจริงจากชุดตัวอย่างและความคิดเห็นของคุณ ดังนั้นนี่คือรหัสที่ทำ
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;
}
ทำไมคุณไม่ต้องการใช้ Char.IsDigit () - ตัวเลขรวมถึงตัวละครเช่นเศษส่วนตัวห้อยตัวยกตัวเอียงตัวเลขโรมันตัวนับสกุลเงินตัวเลขที่ล้อมรอบและตัวเลขเฉพาะสคริปต์
var outputString = String.Join("", inputString.Where(Char.IsDigit));
รับตัวเลขทั้งหมดในสตริง ดังนั้นถ้าคุณใช้สำหรับ examaple '1 plus 2' มันจะได้ '12'
วิธีการขยายเพื่อรับตัวเลขบวกทั้งหมดที่มีอยู่ในสตริง:
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;
}
หากคุณต้องการให้ตัวเลขติดลบเพียงแค่ปรับเปลี่ยนรหัสนี้เพื่อจัดการกับเครื่องหมายลบ ( -
)
รับข้อมูลนี้:
"I was born in 1989, 27 years ago from now (2016)"
รายการหมายเลขผลลัพธ์จะเป็น:
[1989, 27, 2016]
หากตัวเลขมีจุดทศนิยมคุณสามารถใช้ด้านล่าง
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);
}
}
}
ผล :
"อะไรก็ได้ 876.8 อะไร" ==> 876.8
"อะไรก็ได้ 876 อะไร" ==> 876
"$ 876435" ==> 876435
"$ 876.435" ==> 876.435
ตัวอย่าง: https://dotnetfiddle.net/IrtqVt
การย้อนกลับของหนึ่งในคำตอบสำหรับคำถามนี้: วิธีลบตัวเลขออกจากสตริงโดยใช้ 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);
string verificationCode ="dmdsnjds5344gfgk65585";
string code = "";
Regex r1 = new Regex("\\d+");
Match m1 = r1.Match(verificationCode);
while (m1.Success)
{
code += m1.Value;
m1 = m1.NextMatch();
}
วิธีการที่น่าสนใจที่มีให้ที่นี่โดยอาหมัด Mageed ใช้ Regex และ StringBuilder เพื่อดึงจำนวนเต็มในลำดับที่ปรากฏในสตริง
ตัวอย่างการใช้ Regex.Split ตามโพสต์โดย Ahmad Mageed มีดังนี้:
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);
นี่คืออัลกอริทึมของฉัน
//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;
}
นี่คือทางออกของฉัน
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();
คุณจะต้องใช้ Regex เป็น \d+
\d
ตรงกับตัวเลขในสตริงที่กำหนด
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;
}
string s = "kg g L000145.50\r\n";
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"));
ใช้ @ ทิม pietzcker คำตอบจากข้างต้นPowerShell
ต่อไปนี้จะทำงานให้
PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1
จากตัวอย่างสุดท้ายที่ฉันสร้างวิธี:
private string GetNumberFromString(string sLongString, int iLimitNumbers)
{
string sReturn = "NA";
int iNumbersCounter = 0;
int iCharCounter = 0;
string sAlphaChars = string.Empty;
string sNumbers = string.Empty;
foreach (char str in sLongString)
{
if (char.IsDigit(str))
{
sNumbers += str.ToString();
iNumbersCounter++;
if (iNumbersCounter == iLimitNumbers)
{
return sReturn = sNumbers;
}
}
else
{
sAlphaChars += str.ToString();
iCharCounter++;
// reset the counter
iNumbersCounter = 0;
}
}
return sReturn;
}