Как я могу получить целое число и символ отдельно в такой простой строке? - PullRequest
3 голосов
/ 03 октября 2011

У меня есть строки типа: "7d", "5m", "95d" и т. Д.

Мне нужно найти простой способ получить в конце целое число и символ в конце отдельно.

Как мне этого добиться:

int number = GetNumber("95d"); //should return 95
char code = GetCode("95d"); // should return d

Ответы [ 8 ]

5 голосов
/ 03 октября 2011

Это выражения:

[^\d]+ <- not digit
\d+ <- digits

РЕДАКТИРОВАТЬ

    static int GetNumber(string text)
    {
        string pat = @"\d+";
        int output;
        // Instantiate the regular expression object.
        Regex r = new Regex(pat, RegexOptions.IgnoreCase);
        Match m = r.Match(text);
        if (int.TryParse(m.Value, out output))
            return output;
        else
            return int.MinValue; // something unlikely
    }

    static char GetChar(string text)
    {
        string pat = @"[^\d]";
        int output;
        // Instantiate the regular expression object.
        Regex r = new Regex(pat, RegexOptions.IgnoreCase);
        Match m = r.Match(text);
        return m.Value.Length == 1 ? m.Value[0] : '\0';
    }

Вам действительно нужно создать этот RegExp объект только один раз, а не при каждом вызове метода.

4 голосов
/ 03 октября 2011

Простая альтернатива решениям RegEx.

string letters = Seperate( "95d",  c => Char.IsLetter( c ) );
string numbers = Seperate( "95d", c => Char.IsNumber( c ) );

static string Seperate( string input, Func<char,bool> p )
{
    return new String( input.ToCharArray().Where( p ).ToArray() );
}

Вы можете сделать 'Seperate' методом расширения для строки, чтобы сделать вещи немного чище.

3 голосов
/ 03 октября 2011
string s = "95d";
int number = Int32.Parse(s.Substring(0, s.Length - 1));
char code = Char.Parse(s.Substring(s.Length - 1));
2 голосов
/ 03 октября 2011
public int GetNumber(string input)
{
    string result = "";

    foreach (Char c in input)
    {
        if (Char.IsDigit(c))
            result += c;
    }

    return Convert.ToInt32(result);
}

public string GetCode(string input)
{
    string result = "";

    foreach (Char c in input)
    {
        if (!Char.IsDigit(c))
            result += c;     // or return the char if you want only the first one.
    }

    return result;
}

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

2 голосов
/ 03 октября 2011
    private char GetChar(string t)
    {
        return t.Substring(t.Length - 1, 1)[0];
    }

    private int GetNumber(string t)
    {
        return Int32.Parse(t.Substring(0, t.Length - 1));
    }

Редактировать: вторая версия функции GetNumber с TryParse вместо Parse:

    private int GetNumber(string t)
    {
        int result;
        if(Int32.TryParse(t.Substring(0, t.Length - 1), out result) == false)
        {
             // you can handle here incorrect 't' value if you want
        }
        return result;
    }
2 голосов
/ 03 октября 2011

Регулярное выражение, вероятно, излишне - примеры, которые вы доказали, имеют очень простой, согласованный формат.Попробуйте следующие функции в качестве отправной точки:

public int GetNumber(string input)
{
   return int.Parse(input.Substring(0, input.Length - 1));
}


public char GetCode(string input)
{
   return input.Last();
}

Я говорю «в качестве отправной точки», потому что вам нужно будет рассмотреть крайние случаи - как вы будете обрабатывать пустые строки?Может ли строка заканчиваться более чем одним буквенным символом, и если да, то как вы справитесь с этим?Надеюсь, что эти примеры заставят колеса вращаться.

1 голос
/ 03 октября 2011

Вот, пожалуйста:

public class NumberSuffixParser
{
    private static readonly Regex rxPattern = new Regex( @"^(?<number>\d+(\.\d+)?)(?<suffix>\p{L}+)$" , RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture ) ;

    public void Parse( string value , out decimal number , out string suffix )
    {
        if ( value == null ) throw new ArgumentNullException("value") ;
        Match match = rxPattern.Match( value ) ;
        if ( ! match.Success ) throw new ArgumentOutOfRangeException("value") ;
        number = decimal.Parse( match.Groups["number"].Value ) ;
        suffix =                match.Groups["suffix"].Value   ;
        return ;
    }

    public decimal ParseNumber( string value )
    {
        decimal number ;
        string  suffix ;
        Parse( value , out number , out suffix ) ;
        return number ;
    }

    public string ParseSuffix( string value )
    {
        decimal number ;
        string  suffix ;
        Parse( value , out number , out suffix ) ;
        return suffix ;
    }

}

Далее следует другой, немного более упрощенный, но довольно гибкий подход. Он с удовольствием разберет такие вещи, как «789xyz», «1234» или «abcde». Если он не находит префикс целого числа, он возвращает 0. Суффикс - это то, что следует за префиксом целого числа: если он не находит суффикс, он возвращает nil ('').

public static void Parse( string value , out int number , out string suffix )
{
  number = 0 ;
  int i = 0 ;
  for ( i = 0 ; i < value.Length && char.IsDigit( value[i] ) ; ++i )
  {
     number *= 10 ;
     number += ( value[i] - '0' ) ;
  }
  suffix = value.Substring(i) ;
  return ;
}
0 голосов
/ 03 октября 2011

Вы можете попробовать что-то вроде этого:

static string getNumber(String str)
{
    StringBuilder sb = new StringBuilder();
    foreach (char chr in str)
    {
        try
        {
            int x = int.Parse(chr.ToString());
            sb.Append(chr);
        } catch (Exception ex) {
            return sb.ToString();
        }
    }

    return null;
}

static string getCode(String str)
{
    StringBuilder sb = new StringBuilder();
    foreach (char chr in str)
    {
        try
        {
            int x = int.Parse(chr.ToString());
        }
        catch (Exception ex)
        {
            sb.Append(chr);
        }
    }

    return sb.ToString();
}



// 95
Console.WriteLine(getNumber("95d"));
// a
Console.WriteLine(getCode("95d"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...