Axapta:强制容器整数存储为字符串

时间:2009-11-24 18:23:12

标签: integer containers axapta x++

有没有办法强制容器将所有值存储为字符串?我使用str2con将文本字符串拆分为容器。 每当一个只有数字的字段出现时,它就会被存储为一个int,这不是一个大问题。什么是一个大问题是当数字串超过整数大小并且数字变得不同时。

考虑以下字符串:

"Text1,Text2"      Container becomes: str "Text1", str "Text2"
"1111111111,Text"   Container becomes: int 1111111111, str "Text"   
"8888888888,Text"   Container becomes: int -961633963, str "Text"  (THIS IS BAD)

有关如何解决这个问题的任何建议吗?

由于

3 个答案:

答案 0 :(得分:2)

您可以通过查看Global.str2con方法了解Microsoft如何实现str2con。为了防止方法将整数添加到容器中,请复制该方法,并注释掉add2Ret子函数中的三行,以检查字符串是否只是数字。您可能不想修改现有的str2con函数,因为在调用此方法时,系统的其他部分可能依赖于实际上为整数的整数。

void add2Ret(str _current)
{  
    // v-artemt, 26 Jul 2004, PS#: 1741
 //remove next three lines so only integers will be added as strings not integers
 //   if (match('<:d+>', _current))
 //       ret += str2int(_current);
 //   else
        ret += _current;
}

或者你可以添加更复杂的逻辑来检查字符串的长度,如果字符串可能适合整数,则只使用str2int。

答案 1 :(得分:1)

以下是替代实施:

#define.Comma(",")

static container str2con_alt(str _string, str _separator = #Comma, boolean  _ignoreNearSeparator = false)
{
  container con = connull();
  int       pos, oldPos = 1;
  str       tmpStr;

  do
  {
      pos    =  strscan(_string, _separator, pos ? pos + strlen(_separator) : 1, strlen(_string));
      tmpStr =  substr(_string, oldPos, pos ? pos - oldPos : strlen(_string) + 1 - oldPos);

      if (tmpStr || ! _ignoreNearSeparator)
      {
         con += tmpStr;
      }

      oldPos =  pos + strlen(_separator);
  }
  while (pos);

  return con;
}

答案 2 :(得分:0)

全局::的 str2con_RU () 我已经使用过一段时间了,我相信大多数环境都有这种方法。

  

ledgerCon = str2con_RU(ledgerDimStr,#sep);

     

//或

     

ledgerCon = Global :: str2con_RU(ledgerDimStr,#sep);