*
//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;
*
Прежде всего, почему вы пытаетесь преобразовать строку в 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;
}
}
Вот пример правильного использования Int32.TryParse
:
int? value;
int dummy;
if(Int32.TryParse(categoryID, out dummy)) {
value = dummy;
}
else {
value = null;
}
return value;
Вы хотите сделать что-то подобное?
public int? Parse(string categoryID)
{
int value;
if (int.TryParse(categoryID, out value))
{
return value;
}
else
{
return null;
}
}
Как насчет этого?
public int? ParseToNull(string categoryId)
{
int id;
return int.TryParse(categoryId, out id) ? (int?)id : null;
}
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;
}
}
Int - это тип значения, который означает, что не существует такой вещи, как null int. Так что нет, TryParse никогда не изменит параметр out так, чтобы он был равен нулю.
Но проблема, с которой вы столкнулись, заключается в том, что вы передаете строку в параметр out TryParse, когда он ожидает целое число.
Вам нужно что-то вроде этого ...
Int categoryID = 0;
string strCategoryID = "somestringmaybeitsaninteger";
int.TryParse(strCategoryID, out categoryID);
** этот ответ был сильно отклонен ** Хотя это возможное решение - оно плохо с точки зрения производительности и, вероятно, не является хорошим выбором для программирования.
Я не буду удалять его, так как полагаю, что многие программисты могут не знать об этом, поэтому вот пример того, как чтобы ничего не делать:
используйте try and catch
try
{
res = Int32.Parse(strVAR)
}
catch(exception ex)
{
return null;
}