将显示格式从字符模式更改为数字模式

时间:2015-06-14 05:09:32

标签: cobol

变量VAR中的值为-1,当我尝试写入文件时,它显示为J(字符模式),相当于-1。

VAR在Cobol程序字帖中定义如下:
    10 VAR PIC S9(1)。

有没有办法在输出文件中将显示格式从字符“J”更改为-1。

我通过谷歌搜索找到的信息如下:
    值+0字符{
    值-0字符}
    值+1字符A

要将由EBCDIC到ASCII字符转换产生的分区ASCII字段转换为前导符号数字字段,请检查字段中的最后一位数字。如果是“{”则用0替换最后一位数字并使数字为正数。如果是“A”,则用1替换最后一位数字并将数字设为正数,如果是“B”则用2替换最后一位数字并将数字设为正数等,等等。如果最后一位是“ “用0替换最后一位数字并将数字设为负数。如果它是“J”,则将最后一位数字替换为1并将数字设为负数,如果是“K”则将最后一位数字替换为2并将数字设为负数,等等。遵循这些规则以获取所有可能的值。您可以使用查找表或IF或CASE语句执行此操作。使用适合您所用语言的最佳方法。在大多数情况下,您应该将符号放在字段中第一个数字的前面。这称为浮动符号,是大多数PC程序所期望的。例如,如果您的字段是6个字节,则值-123应为“-123”而不是“ - 123”。

2 个答案:

答案 0 :(得分:1)

将它移动到EBCDIC输出(显示)字段以使其只是EBCDIC字符,然后将其转换为ASCII并写入它可能更简单。

例如

public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        currentElement = true;
        db = new DatabaseHelper(thecontext);
        if (qName.equals("Asa.Amms.Data.Entity.User")) {
            int length = attributes.getLength();
            for (int i = 0; i < length; i++) {
                String name = attributes.getQName(i);
                if (name.equals("Id")) {
                    id = Integer.parseInt(attributes.getValue(i));
                }
                if (name.equals("Login")) {
                    LoginID = attributes.getValue(i).toString();
                }
                if (name.equals("Name")) {
                    Name = attributes.getValue(i).toString();
                }
                if (name.equals("Password")) {
                    Password = attributes.getValue(i).toString();
                }
                if (name.equals("ProgramOfficerId")) {
                    user_ProgramOfficerId = Integer.parseInt(attributes.getValue(i).toString());
                }
            }
            Log.i("Baal dhukbe", id + LoginID + Name + Password);

            db.insertUser(id, LoginID, Name, Password, user_ProgramOfficerId);
        }
}

然后使用标准查找表将WS-OUT转换为ASCII并将其写入文件。

答案 1 :(得分:1)

如果要将数据从EBCDIC机器发送到ASCII机器,或者反之亦然,到目前为止,最好的方法是仅处理字符数据。然后,您可以让传输/通信机制在记录/文件级别执行ASCII / EBCDIC转换。

字段级翻译是可能的,但更容易出错(必须为所有内容准确定义字段)并且速度较慢(许多翻译与一个翻译)。

SIGN子句是一种非常好的方法。没有必要重新定义该字段(再次遇到字段定义问题,如果更改大小,则需要更改两个位置)。

小数位存在类似的问题。在源和数据定义不相同的情况下,必须提供显式小数点,或单独的缩放因子。

这两个问题和原始问题也可以通过使用数字编辑的定义来处理。

01  transfer-record.
    ...
    05  numeric-edited-VAR1 PIC +9.
    ...

如果是肯定的,则会包含+1,其中包含{1}},其中包含-1

取一个金额字段:

01  VAR2 PACKED-DECIMAL PIC S9(7)V99.
...
01  transfer-record.
    ...
    05  numeric-edited-VAR2 PIC +9(7).99.
    ...

对于4567.89,为正,新字段将包含+0004567.79。对于相同的值,但为负值,-0004567.79

Source-machine上的代码是:

MOVE VAR1 TO numeric-edited-VAR1
MOVE VAR2 TO numeric-edited-VAR2

在目标上(在COBOL中)

MOVE numeric-edited-VAR1 TO VAR1
MOVE numeric-edited-VAR2 TO VAR2

如果您对没有小数位的字段使用SIGN子句(或者如果您希望隐含关于它的危险,请使用小数位),代码是相同的。

现场级翻译的另一个问题是审核员不喜欢/不喜欢它。 &#34;当数据到达时你做的第一件事就是更改它?真正&#34?;审计员说。