我有一个平面文件,下面有金额列表,请你告诉我,以{,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;
谢谢,
答案 0 :(得分:3)
该数字看起来像 Mainframe Cobol 分区十进制数字(当然也包括AS400 Cobol的EBCDIC Cobol)。最后一位代表 数字符号和最后一个数字位数(即{= + 0;} = -0; A = 1; J = -1; B = 2; k = -2等)。 {,A,B是EBCDIC格式的连续字符。
因此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等中生成一个}。