%UINT 內建函數

%UINT 會將字元、邏輯、十進位或整數資料轉換成不帶正負號的整數格式。 轉換值可以指派給 CL 變數,以數值常數傳遞給另一個程式或程序,或指定為從已編譯 CL 執行之 CL 指令的指令參數值。

%UINT 內建函數可以在 CL 支援算術表示式的任何地方使用。 %UINT 可以單獨使用,也可以作為更複雜的算術表示式的一部分。 例如,在 IFWHEN 指令的 COND 參數中, %UINT 可以用來比較十進位 CL 變數與不帶正負號的整數 CL 變數。 如果相關指令物件定義具有 EXPR (*YES) 且 TYPE 為 *DEC、 *INT2、 *INT4、 *UINT2或 *UINT4的參數,則 %UINT 也可以用來設定 CL 指令參數的值。

轉換為不帶正負號的整數資料內建函數的格式為:
%UINT(convert-argument)
它也可以格式化為:
%UNS(convert-argument)

convert-argument 必須是 TYPE 為 *CHAR、*LGL、*DEC 或 *INT 的 CL 變數。

如果 convert-argument 參數是字元變數,則適用下列規則:
  • 符號是選用的。 它只能是 '+'。 它可以在數值資料之前或之後。
  • 小數點是選用的。 它可以是句點或逗點。
  • 資料中容許前導及尾端空白。 例如, ' + 3 ' 是有效的參數。
  • 全部-空白值將會傳回零值。
  • 如果發現無效的數值資料,則會發生異常狀況,並出現 CPF0818。

結果將採用不帶正負號的整數格式,任何小數位數都會被截斷而不捨入。 結果的大小一律為 4 個位元組。

下列是使用 %UINT 內建函數的範例:

附註: * 容許 %UNS 與 RPG 相容,但程式碼範例將使用 %UINT。
  • 轉換字元變數
    DCL VAR(&POINTS) TYPE(*CHAR) LEN(10) VALUE('+123.45')
    DCL VAR(&ANSWER) TYPE(*UINT)
    
    /* &ANSWER will have the value 223 */
    CHGVAR VAR(&ANSWER) VALUE(100 + %UINT(&POINTS))
  • 轉換邏輯變數
    DCL VAR(&ANSWER1) TYPE(*LGL) VALUE('1')
    DCL VAR(&ANSWER2) TYPE(*LGL) VALUE('1')
    DCL VAR(&NUM) TYPE(*UINT)
    
    /* &NUM will have the value 2. */
    CHGVAR VAR(&NUM) VALUE(%UINT(&ANSWER1) + %UINT(&ANSWER2))
    SNDPGMMSG MSG('The number of YES answers is' *BCAT %CHAR(&NUM)) 
  • 轉換壓縮十進位變數
    DCL VAR(&POINTS1) TYPE(*DEC) LEN(5 2) VALUE(100.23)
    DCL VAR(&POINTS2) TYPE(*DEC) LEN(5 2) VALUE(100.45)
    
    IF (%UINT(&POINTS1) *EQ %UINT(&POINTS2)) +
    THEN(SNDPGMMSG ('The scores are the same!'))
  • 轉換整數變數
    DCL VAR(&P1) TYPE(*UINT) LEN(2)
    DCL VAR(&P2) TYPE(*INT) LEN(2) VALUE(1)
    
    CHGVAR VAR(&P1) VALUE(%UINT(&P2))
  • 小數位數將被截斷而不捨入
    DCL VAR(&STRING) TYPE(*CHAR) LEN(10) VALUE('+123.9')
    DCL VAR(&ANSWER) TYPE(*UINT)
    
    /* &ANSWER will have the value 123 */
    CHGVAR VAR(&ANSWER) VALUE(%UINT(&STRING))