RPGLE - 如何将字符串转换为 ProperCase / TitleCase

RPGLE - How to Convert String to ProperCase / TitleCase

在 IBMi/iseries/AS400 上的 RPGLE 编程语言中,如何将字符串转换为 ProperCase / TitleCase?

和往常一样,我 google 我的 $%# 折扣,最后我用自己的解决方案来制作科学怪人。

这在下面有记录,因为我不可避免地需要再次使用这个过程。至少我知道 google 会为我找到解决方案。

@FutureSelf => 哇哦,它就在这里!!!

 ?*--------------------------------------------------
 ?* Procedure name: ConverToTitleCase
 ?*--------------------------------------------------
   dcl-proc ConvertToTitleCase export;
     dcl-pi *n  varchar();
       i_String varchar() const;
     end-pi;

     dcl-s o_String varchar();
     dcl-s w_Text char();
     dcl-s w_Word char();
     dcl-s p_Word pointer;
     dcl-s p_Last pointer;

     dcl-c UPPER const(0);
     dcl-c lower const(1);

     dcl-pr GetToken pointer ExtProc('strtok_r');
       String pointer value options(*string);
       Seps   pointer value options(*string);
       Lasts  pointer ;
     end-pr;
     dcl-c BLANK const(' ');
     //-------------------------------------------------
     if %trim(i_String) = *blanks;
       return i_String; //Nothing to Convert;
     endif;
     //-------------------------------------------------
     p_Word = GetToken(ConvertCase(i_String:lower):BLANK:p_Last);
     dow p_Word <> *null;

       w_Word = %str(p_Word);
       %subst(w_Word:1:1) = ConvertCase(%subst(w_Word:1:1):UPPER);
       o_String += BLANK + w_Word;
       p_Word = GetToken(*NULL:BLANK:p_Last);
     enddo;
     //-------------------------------------------------
     return o_String;
   end-proc;
   //***************************************************
   dcl-proc ConvertCase;
     dcl-pi *n  varchar();
       i_String varchar() const;
       i_CaseTo int(5)    const;
     end-pi;

     dcl-s o_String varchar();

     //Control Block for the call to QglConvertCase.
     dcl-ds FormatOfRequestControlBlock;
       ReqType  int(10)  inz(1); //Convert String
       CCSID    int(10)  inz(0); //CCSID of JOB
       CaseTo   int(10)  inz(0); //Default Lower
       Reserved char(10) inz(*ALLX'00');
     end-ds;

     dcl-s APIError char(16) inz(*ALLX'00');

     dcl-pr QlgCvtCase ExtProc('QlgConvertCase');
       ctrlBlock  LikeDS(FormatOfRequestControlBlock) Const;
       inString   char(65535)   Options(*VARSIZE)     Const;
       OutString  char(65535)   Options(*VARSIZE);
       Length     int(10) Const;
       APIError   like(APIError);
     end-pr;

     if %len(%trim(i_String)) <= 0;
       return i_String; //Noting to convert;
     endif;

     FormatOfRequestControlBlock.CaseTo = i_CaseTo;

     QlgCvtCase(FormatOfRequestControlBlock
               :i_String
               :o_String
               :%len(i_String)
               :APIError);

     return %Subst(o_String:1:%Len(i_String));
   end-proc;
   //***************************************************