0

私は、変数の先頭の 0 を数え、4GL コードを使用して別の変数に配置する必要があるシナリオにいます。

たとえば、変数 i (整数) が「00000546」の場合、

  1. 5なので数える必要があります
  2. '00000' + '546' のように別の変数 b (文字) に配置します

教えてください。

4

6 に答える 6

2

先行ゼロを数える最も簡単な方法:

DEF VAR iNum AS INTEGER NO-UNDO.
DEF VAR cValue AS CHAR NO-UNDO.
DEF VAR iLeadZero AS INTEGER NO-UNDO.

ASSIGN 
  cValue = '00000546'
  iNum = INTEGER(cValue)
  iLeadZero = LENGTH(cValue) - LENGTH(STRING(iNum)). 

関数としても実行できます (エラー処理なし):

FUNCTION cntLeadZeros RETURNS INTEGER
    (INPUT pcValue AS CHARACTER):
    DEF VAR iNum AS INTEGER NO-UNDO.
    DEF VAR iLeadZero AS INTEGER NO-UNDO.

    ASSIGN 
      iNum = INTEGER(pcValue)
      iLeadZero = LENGTH(pcValue) - LENGTH(string(iNum)). 

    RETURN iLeadZero.
END FUNCTION. /* cntLeadZeros */

エラー処理を伴う関数なので、人が非整数値を通過した場合。

FUNCTION cntLeadZeros2 RETURNS INTEGER
    (INPUT pcValue AS CHARACTER):
    DEF VAR iNum AS INTEGER NO-UNDO.
    DEF VAR iLeadZero AS INTEGER NO-UNDO.

    ASSIGN 
      iNum = INTEGER(pcValue)
      iLeadZero = LENGTH(pcValue) - LENGTH(string(iNum)). 

    IF ERROR-STATUS:ERROR THEN
        RETURN ?.

    RETURN iLeadZero.
END FUNCTION. /* cntLeadZeros2 */ 
于 2013-11-06T07:39:08.403 に答える
0

整数データ型には先行ゼロがないため、ゼロを数える必要はありません。以下の例のように、STRING 関数を使用するだけで簡単に実行できます。以下のこの例では、文字列が固定長であると考えています。

DEFINE VARIABLE i-test  AS INTEGER INITIAL 546.
DEFINE VARIABLE c-test  AS CHARACTER.

ASSIGN c-test = STRING(i-test,"99999999").

MESSAGE c-test VIEW-AS ALERT-BOX.

メッセージが返されます: 00000546

于 2013-11-07T19:42:07.407 に答える
0

あなたが説明したように新しい変数をアサートしたい理由はわかりませんが、正当な理由がある可能性があります。おそらくあなたはもっと説明できますか?

とにかく、これは私がそれを行う方法です:

DEFINE VARIABLE a  AS CHARACTER NO-UNDO.
DEFINE VARIABLE nr AS INTEGER   NO-UNDO.
DEFINE VARIABLE b  AS CHARACTER NO-UNDO.

a = STRING(546,"99999999").
nr = LENGTH(a) - LENGTH(LEFT-TRIM(a,"0")).
b = FILL("0",nr) + LEFT-TRIM(a,"0").

MESSAGE a SKIP nr SKIP b
    VIEW-AS ALERT-BOX INFO BUTTONS OK.
于 2013-11-06T12:23:41.997 に答える
0

これを行う方法は次のとおりです。文字をループします。

def var a as char no-undo.
def var b as char no-undo.
def var c as char no-undo.
def var v as int  no-undo.

assign a = '00000546'.

do v = 1 to length(a):

   assign c = substring(a,v,1).

   if c ne "0" then leave.

end.

assign b = substring(a,v).

disp fill("0", v - 1) b.
于 2013-11-05T22:56:40.013 に答える