使用C#或BizTalk Functoid将字符串转换为十进制值

时间:2013-10-08 17:26:34

标签: decimal biztalk flat-file decimal-point

我有一个平面文件,下面有金额列表,请你告诉我,以{,A,H,E,C,I,F结尾的charectors是什么意思,我怎样才能在下面这样做金额列表为两点十进制值,如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;

谢谢,

1 个答案:

答案 0 :(得分:3)

该数字看起来像 Mainframe Cobol 分区十进制数字(当然也包括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等中生成一个}。