1

我有一个包含以下金额列表的平面文件,你能告诉我,以 {,A,H,E,C,I,F 结尾的字符是什么意思,我怎样才能在下面列出金额变成两点十进制值,例如 1234567.80 ?

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

我已经尝试过以下方式,并且可以放置“。” 在所有它们的两个子字符串之间,出于某种原因,我想以某种动态方式尝试在我的应用程序中看不到一些问题。

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分区十进制数(当然是 EBCDIC Cobol,它也包括 AS400 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几乎肯定有代码来区分这些数字。或者,它可以通过许多实用程序(即排序、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 回答