1

以下の金額のリストを含むフラット ファイルがあります。{,A,H,E,C,I,F で終わる文字の意味を教えてください。金額のリストの下にこれを作成するにはどうすればよいですか1234567.80 のような 2 桁の 10 進数値に変換しますか?

12345678{
00484326A
00000210H
00000185A
00000077E
00000833C
00000255I
00000077E
00000039F
00000088A
00000000F
00000000A
00000100{

以下の方法で試してみたところ、「。」を配置できました。それらすべての2つの部分文字列の間で、何らかの理由で、アプリケーションでいくつかの問題が発生しないように動的な方法で試してみたいと思います。

string decimalstring = "12345678{";
decimalstring = decimalstring.Replace("{", "0");
int String1 = Convert.ToInt32(decimalstring.Substring(0, decimalstring.Length - 2));
string String2 = decimalstring.Substring(decimalstring.Length - 2, 2);
string Result = String1 + "." + String2;

ありがとうございました、

4

1 に答える 1

3

この数値は、メインフレーム COBOLゾーン 10 進数 (AS400 Cobol も含まれる EBCDIC Cobol であることは確かです)のように見えます。最後の桁は数字記号と最後の数字を表します (つまり、{ = +0; } = -0; A = 1; J=-1; B=2; k=-2 など)。{、A、B は、EBCDIC 形式の連続文字です。

  • {、A、B .. H は正の 0 .. 9 を表します
  • }、J、K .. R は負の 0 .. 9 を表します

したがって、123B は +1232 で、123K は -1232 です。

Biztalkには、これらの数値を解読するためのコードがほぼ確実に含まれています。あるいは、多くのユーティリティ (つまり、sort、easytrieve など) によって、メインフレーム上の通常の数値に簡単に変換できます。

ファイルを翻訳できない場合は、Cobol Copybook を入手する価値があります。

数値を解読するための Java コードを次に示します (C# への変換が難しくないはずです)。

private static int positiveDiff = 'A' - '1';
private static int negativeDiff = 'J' - '1';

public static String fromZoned(String numZoned) {
    String ret;
    String sign = "";
    char lastChar;

    if (numZoned == null || numZoned.equals("") || numZoned.equals("-")) {
        // throw ...
        return "";
    }

    ret = numZoned.trim();
    lastChar = ret.substring(ret.length() - 1).toUpperCase().charAt(0);

    switch (lastChar) {
        case '}' : sign = "-";
        case '{' :
            lastChar = '0';
        break;
        case 'A':
        case 'B':
        case 'C':
        case 'D':
        case 'E':
        case 'F':
        case 'G':
        case 'H':
        case 'I':
            lastChar = (char) (lastChar - positiveDiff);
        break;
        case 'J':
        case 'K':
        case 'L':
        case 'M':
        case 'N':
        case 'O':
        case 'P':
        case 'Q':
        case 'R':
            sign = "-";
            lastChar = (char) (lastChar - negativeDiff);
        default:
    }
    ret = sign + ret.substring(0, ret.length() - 1) + lastChar;

    return ret;
}

ちなみに、フォーマットは古いPunch-Cardsから来ています。スペースを節約するために、最後の数字を記号で上書きしました。0 をマイナス (または使用したもの) で上書きすると、EBCDIC などで } が生成されます)。

于 2013-10-08T20:34:20.457 に答える