1

コンテナにすべての値を文字列として格納するように強制する方法はありますか?テキスト文字列をコンテナに分割するために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)

これを回避する方法について何か提案はありますか?

ありがとう

4

3 に答える 3

2

Global.str2conメソッドを見ると、Microsoftがstr2conをどのように実装したかがわかります。メソッドがコンテナに整数を追加しないようにするには、メソッドのコピーを作成し、文字列が数字のみであるかどうかを確認するadd2Retサブ関数の3行をコメントアウトします。このメソッドを呼び出すときに、システムの他の部分が実際には整数である整数に依存している可能性があるため、既存の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を使用することもできます。

于 2009-11-24T21:05:50.213 に答える
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;
}
于 2009-11-27T18:18:38.677 に答える
0

グローバル:: str2con_RU()私はこれを何度か使用しましたが、ほとんどの環境でこのメソッドがあると思います。

ledgerCon = str2con_RU(ledgerDimStr、#sep);

//また

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

于 2017-06-22T07:08:11.760 に答える