int.TryParse = null, если не числовой?

*

//Basic functionality of a TStringList solves this:


uses Classes  //TStringList 
    ,types    //TStringDynArray
    ,SysUtils //StringReplace()
    ;

....

 //--------------------------------------------------------------------------
 function _SplitString(const s:string; const delimiter:Char):TStringDynArray;
  var sl:TStringList;
      i:integer;
  begin
  sl:=TStringList.Create;

  //separete delimited items by sLineBreak;TStringlist will do the job:
  sl.Text:=StringReplace(s,delimiter,sLineBreak,[rfReplaceAll]);

  //return the splitted string as an array:
  setlength(Result,sl.count);
  for i:=0 to sl.Count-1
   do Result[i]:=sl[i];

  sl.Free;
  end;



//To split a FileName (last item will be the pure filename itselfs):

 function _SplitPath(const fn:TFileName):TStringDynArray;
  begin
  result:=_SplitString(fn,'\');
  end;

*

13
задан jason 13 November 2009 в 15:52
поделиться

7 ответов

Прежде всего, почему вы пытаетесь преобразовать строку в int и вставить результат обратно в строку?

Сигнатура метода -

bool int.TryParse(string, out int)

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

int? TryParse2(string s) {
    int i;
    if (!int.TryParse(s, out i)) {
        return null;
    } else {
        return i;
    }
}
27
ответ дан 1 December 2019 в 17:34
поделиться

Вот пример правильного использования Int32.TryParse :

int? value;
int dummy;
if(Int32.TryParse(categoryID, out dummy)) {
    value = dummy;
}
else {
    value = null;
}
return value;
14
ответ дан 1 December 2019 в 17:34
поделиться

Вы хотите сделать что-то подобное?

public int? Parse(string categoryID) 
{
  int value;
  if (int.TryParse(categoryID, out value))
  {
    return value;
  }
  else
  {
    return null;
  }
}
0
ответ дан 1 December 2019 в 17:34
поделиться

Как насчет этого?

public int? ParseToNull(string categoryId)
{
    int id;
    return int.TryParse(categoryId, out id) ? (int?)id : null;
}
10
ответ дан 1 December 2019 в 17:34
поделиться

TryParse вернет false, если строка не может быть проанализирована. Вы можете использовать этот факт для возврата либо проанализированного значения, либо null. В любом случае, я предполагаю, что вы собираетесь вернуть int? из своего метода, тогда это будет примерно так:

public int? ParseInt(string categoryID) 
{
    int theIntValue;
    bool parseOk = int.TryParse(categoryID, out theIntValue);
    if(parseOk) {
        return theIntValue;
    } else {
        return null;
    }
}
0
ответ дан 1 December 2019 в 17:34
поделиться

Int - это тип значения, который означает, что не существует такой вещи, как null int. Так что нет, TryParse никогда не изменит параметр out так, чтобы он был равен нулю.

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

Вам нужно что-то вроде этого ...

Int categoryID = 0;
string strCategoryID = "somestringmaybeitsaninteger";

int.TryParse(strCategoryID, out categoryID);
0
ответ дан 1 December 2019 в 17:34
поделиться

** этот ответ был сильно отклонен ** Хотя это возможное решение - оно плохо с точки зрения производительности и, вероятно, не является хорошим выбором для программирования.

Я не буду удалять его, так как полагаю, что многие программисты могут не знать об этом, поэтому вот пример того, как чтобы ничего не делать:

используйте try and catch

try
{
res = Int32.Parse(strVAR)
}
catch(exception ex) 
{
 return null;
}
0
ответ дан 1 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: