2013-10-08 3 views
1

У меня есть плоский файл с нижеследующим списком сумм, не могли бы вы рассказать мне, в чем смысл charectors, которые заканчиваются на {, A, H, E, C , I, F и как я могу сделать этот ниже список суммы на двухточечное десятичное значение примерно как 1234567.80?Преобразование строки в десятичное значение с помощью C# или BizTalk Functoids

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; 

Спасибо,

+0

Если это действительно мэйнфрейм Cobol Zoned десятичный формат, я думаю, что это должно быть первым для BizTalk! –

ответ

3

Номер выглядит как мэйнфреймов Cobol Zoned десятичного число (конечно EBCDIC Cobol, который также будет включать в себя AS400 Cobol). Последняя цифра представляет числовой знак и последнюю цифровую цифровую цифру (i.e {= +0;} = -0; A = 1; J = -1; B = 2; k = -2 и т. Д.). {, A, B являются последовательными символами в формате EBCDIC.

  • {A, B .. Н представляют собой положительный 0 .. 9
  • }, J, К .. R представляют собой отрицательный 0 .. 9

Так 123B является +1232 и 123K -1232.

Biztalk почти наверняка имеет код для определения этих чисел. В качестве альтернативы, его можно легко перевести на обычное число на мэйнфрейме с помощью ряда утилит (т. Е. Sort, easytrieve и т. Д.).

Если вы не можете перевести файл, возможно, стоит приобрести Кободол.

Вот Java код, чтобы decifer номер (Это не должно не должно быть трудно преобразовать в 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- Карты. Чтобы сэкономить место, они набрали последнюю цифровую цифру со знаком; Переопределение 0 с минусом (или тем, что они использовали) генерирует} в EBCDIC и т. Д.).