001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    import java.awt.Color;
019    import java.io.PrintWriter;
020    import java.io.StringWriter;
021    import java.io.UnsupportedEncodingException;
022    import java.net.URLEncoder;
023    import java.net.URLDecoder;
024    import java.util.ArrayList;
025    import java.util.Arrays;
026    import java.util.Enumeration;
027    import java.util.HashMap;
028    import java.util.Iterator;
029    import java.util.Map;
030    import java.util.StringTokenizer;
031    import java.util.Locale ;                               // 5.7.2.3 (2014/01/31)
032    import java.nio.charset.Charset;                // 5.5.2.6 (2012/05/25)
033    
034    
035    /**
036     * StringUtil.java は、å?通的に使用されã‚?String関連メソãƒ?ƒ‰を集ç´?�—たã?クラスですã?
037     *
038     * @og.group ユーãƒ?‚£リãƒ?‚£
039     *
040     * @version  4.0
041     * @author       Kazuhiko Hasegawa
042     * @since    JDK5.0,
043     */
044    public final class StringUtil {
045    
046            /** バッファの初期容量を通常より多い目に設定しますã?(200)  */
047            private static final int BUFFER_MIDDLE = 200;
048    
049            /** シスãƒ?ƒ 依存ã?改行記号をセãƒ?ƒˆしますã?     */
050            private static final String CR = System.getProperty("line.separator");
051    
052            /**
053             * プラãƒ?ƒˆフォーãƒ?¾�存ã?ãƒ?ƒ•ォルトã? Charset ですã?
054             * プラãƒ?ƒˆフォーãƒ?¾�存æ?をè?慮する場合ã?エンコード指定で作æ?しておく事をお勧めしますã?
055             *
056             * @og.rev 5.5.2.6 (2012/05/25) findbugs対å¿?
057             */
058            public static final Charset DEFAULT_CHARSET = Charset.defaultCharset() ;
059    
060            /**
061             * code39 のチェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆ計算に使用する モジュラス?”ï¼?の変換表ですã?
062             *
063             */
064            private static final String MODULUS_43 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" ;
065    
066            /**
067             * getUnicodeEscape で使用する桁合わせ用æ–?­—å?配å?ですã?
068             * Unicodeの HexString 変換後ã?桁に応じて、埋め合わせしますã?
069             *
070             */
071            private static final String[] UTF_STR = { "&#x0000", "&#x000", "&#x00", "&#x0", "&#x" };
072    
073            // 4.0.3.0 (2007/12/26) 色コードにPURPLE を追åŠ?
074            // 5.7.8.0 (2014/07/04) 透æ?追åŠ?
075            private static final Map<String,Color> CLR_MAP;
076            static {
077                    CLR_MAP = new HashMap<String,Color>();
078                    CLR_MAP.put( "BLACK"            ,Color.BLACK            );
079                    CLR_MAP.put( "BLUE"                     ,Color.BLUE                     );
080                    CLR_MAP.put( "CYAN"                     ,Color.CYAN                     );
081                    CLR_MAP.put( "DARK_GRAY"        ,Color.DARK_GRAY        );
082                    CLR_MAP.put( "GRAY"                     ,Color.GRAY                     );
083                    CLR_MAP.put( "GREEN"            ,Color.GREEN            );
084                    CLR_MAP.put( "LIGHT_GRAY"       ,Color.LIGHT_GRAY       );
085                    CLR_MAP.put( "MAGENTA"          ,Color.MAGENTA          );
086                    CLR_MAP.put( "ORANGE"           ,Color.ORANGE           );
087                    CLR_MAP.put( "PINK"                     ,Color.PINK                     );
088                    CLR_MAP.put( "RED"                      ,Color.RED                      );
089                    CLR_MAP.put( "WHITE"            ,Color.WHITE            );
090                    CLR_MAP.put( "YELLOW"           ,Color.YELLOW           );
091                    CLR_MAP.put( "PURPLE"           ,new Color( 8388736 )   );              // #800080
092                    CLR_MAP.put( "TRANSPARENT"      ,new Color( 255,255,255,0 )     );      // 5.7.8.0 (2014/07/04) 透æ?追åŠ?
093            }
094    
095            /**
096             *      ãƒ?ƒ•ォルトコンストラクターをprivateにしてã€?
097             *      オブジェクトã?生æ?をさせなã�?‚ˆã�?�«するã€?
098             *
099             */
100            private StringUtil() {}
101    
102            /**
103             * UTF-8 で、URLエンコードを行いますã?
104             * こã?メソãƒ?ƒ‰は、JDK1.4 以上でなã�?�¨使用できませんã€?
105             *
106             * @param       value エンコードする文字å?
107             *
108             * @return       æŒ?®šã?æ–?­—コードで?µ?²?¬エンコードされたæ–?­—å?
109             */
110            public static String urlEncode( final String value ) {
111                    if( value == null ) { return ""; }
112    
113                    try {
114                            return URLEncoder.encode( value,"UTF-8" );
115                    }
116                    catch( UnsupportedEncodingException ex ) {
117                            String errMsg = "UnsupportedEncodingException [UTF-8]" + CR
118                                                    + ex.getMessage() ;
119                            throw new RuntimeException( errMsg,ex );
120                    }
121                    catch( RuntimeException ex2 ) {         // 3.6.0.0 (2004/09/17)
122                            String errMsg = "予期せぬエラー value=[" + value + "] , encode=[UTF-8]" + CR
123                                                    + ex2.getMessage();
124                            throw new RuntimeException( errMsg,ex2 );
125                    }
126            }
127    
128            /**
129             * UTF-8 でURLエンコードされたæ–?­—å?をデコードしますã?
130             * こã?メソãƒ?ƒ‰は、JDK1.4 以上でなã�?�¨使用できませんã€?
131             *
132             * @og.rev 5.4.5.0 追åŠ?
133             * @param       value ãƒ?‚³ードする文字å?
134             *
135             * @return       ãƒ?‚³ードされたæ–?­—å?
136             */
137            public static String urlDecode( final String value ) {
138                    try {
139                            return URLDecoder.decode( value,"UTF-8" );
140                    }
141                    catch( UnsupportedEncodingException ex ) {
142                            String errMsg = "UnsupportedEncodingException [UTF-8]" + CR
143                                                    + ex.getMessage() ;
144                            throw new RuntimeException( errMsg,ex );
145                    }
146                    catch( RuntimeException ex2 ) {         // 3.6.0.0 (2004/09/17)
147                            String errMsg = "予期せぬエラー value=[" + value + "] , encode=[UTF-8]" + CR
148                                                    + ex2.getMessage();
149                            throw new RuntimeException( errMsg,ex2 );
150                    }
151            }
152    
153            /**
154             * æ–?­—å?の後ろのスペã?スを削除しますã?
155             * String クラスの trim()メソãƒ?ƒ‰は、文字å?の両方のスペã?スを削除しますがã€?
156             * こã? rTrim( String ) は、後ろの半角スペã?スのみ、詰めますã?
157             * 注意ï¼?\u0020' (スペã?スæ–?­? より小さã�?–‡字をåˆ?‚Š取りますã?
158             *
159             * @param       str å…??æ–?­—å?
160             *
161             * @return      後ろの半角スペã?スを詰めた、新しいæ–?­—å?
162             */
163            public static String rTrim( final String str ) {
164                    if( str == null )  { return null; }
165                    int count = str.length();
166    
167                    int len = count;
168    
169                    while ( 0 < len && str.charAt(len-1) <= ' ' ) {
170                            len--;
171                    }
172                    return (len < count) ? str.substring(0, len) : str;
173            }
174    
175            /**
176             * æ–?­—å?の後ろからã€? .0" のæ–?­—を削除した数字型æ–?­—å?を返しますã?
177             * 数字型æ–?­—å?は、å?力文字å?の後ろの スペã?ス、小数点、ゼロを削除しますã?
178             * またã?先é?がã?"." で始まるå?合ã?ã€?0" を追åŠ?�—ますã?
179             * � "123.00" �"123" , ".123" �"0.123"
180             *
181             * @og.rev 3.8.8.1 (2007/01/10) 新規作æ?
182             *
183             * @param       str å…??æ–?­—å?
184             *
185             * @return      数字文字å?化された、新しいæ–?­—å?
186             */
187            public static String toNumber( final String str ) {
188                    if( str == null )  { return null; }
189    
190                    String rtn = str.trim() ;
191    
192                    int adrs = rtn.indexOf( '.' );
193                    int count = rtn.length();
194                    int len = count;
195    
196                    if( adrs >= 0 ) {
197                            while ( adrs < len && ".0".indexOf( rtn.charAt(len-1) ) >= 0 ) {
198                                    len--;
199                            }
200                    }
201    
202                    if( len < count ) { rtn = rtn.substring(0, len); }
203                    if( adrs == 0 ) { rtn = "0" + rtn; }
204    
205                    return rtn ;
206            }
207    
208            /**
209             * æ–?­—å?の前方のゼロ(??を削除しますã?
210             * 先é?の?�を削除するまえに、trim して、スペã?スを削除しておきますã?
211             *
212             * @og.rev 3.5.4.5 (2004/01/23) 新規追åŠ?
213             *
214             * @param       in å…??æ–?­—å?
215             *
216             * @return      前方のゼロ(??を削除した、新しいæ–?­—å?
217             */
218            public static String lTrim0( final String in ) {
219                    if( in == null )  { return null; }
220                    String str = in.trim();
221                    int count = str.length();
222    
223                    int len = 0;
224    
225                    while ( count > len && str.charAt(len) == '0' ) {
226                            len++;
227                    }
228    
229                    if( len == 0 ) { return str; }                          // 先é?がゼロでなã�??
230                    else if( len == count ) { return "0"; }         // すべてがゼロ
231                    else if( str.charAt(len) == '.' ) { return "0" + str.substring(len); }
232                    else { return str.substring(len); }
233            }
234    
235            /**
236             * æ–?­—å?配å?のå�?¦�ç´??後ろのスペã?スを削除しますã?
237             * 個ã?の配å?要ç´?�«対して、rTrim( String str ) を適用しますã?
238             * å…??æ–?­—å?配å?に直接作用するのではなくã?新しいæ–?­—å?配å?に
239             * 結果をコピã?して返しますã?
240             * ただしã?å…??æ–?­—å?配å?がã?null かã?length == 0 の場合ã?ã€?
241             * å…??æ–?­—å?配å?(アドレス)を返しますã?
242             * 注意ï¼?\u0020' (スペã?スæ–?­? より小さã�?–‡字をåˆ?‚Š取りますã?
243             *
244             * @param       str å…??æ–?­—å?
245             *
246             * @return      後ろの半角スペã?スを詰めた、新しいæ–?­—å?
247             */
248            public static String[] rTrims( final String[] str ) {
249                    if( str == null || str.length == 0 ) { return str; }
250    
251                    String[] rtn = new String[ str.length ];
252                    for( int i=0; i<str.length; i++ ) {
253                            rtn[i] = rTrim( str[i] );
254                    }
255                    return rtn ;
256            }
257    
258            /**
259             * æ–?­—å?の前後ã?ãƒ?ƒ–ルクオートを取り外しますã?
260             * 前後にãƒ?ƒ–ルクオートが入ってã�?�ªければ、そのままのæ–?­—å?を返しますã?
261             * 前後に入ってã�?�ªã�?ç‰?–¹のみなど)場合も、そのままのæ–?­—å?を返しますã?
262             *
263             * @param       str å…??æ–?­—å?
264             *
265             * @return      ãƒ?ƒ–ルクオートを取り外した新しいæ–?­—å?
266             */
267            public static String csvOutQuote( final String str ) {
268                    if( str == null )  { return null; }
269                    int end = str.length();
270    
271                    if( end < 2 || str.charAt(0) != '"' || str.charAt( end-1 ) != '"' ) {
272                            return str;
273                    }
274    
275                    return str.substring( 1,end-1 ) ;
276            }
277    
278            /**
279             * å†?ƒ¨で使われã‚?byte[] から String 生æ? メソãƒ?ƒ‰
280             *
281             * @param       byteValue        変換するバイトå?
282             * @param       start            変換開始アドレス
283             * @param       length           変換バイト数
284             * @param       encode           変換するæ–?­—エンコーãƒ?
285             *
286             * @return      変換後文字å?
287             */
288            public static String makeString( final byte[] byteValue, final int start, final int length,final String encode ) {
289    
290                    if( encode.startsWith( "Unicode" ) ) {
291                            String errMsg = "Unicodeæ–?­—å?は、変換できませんã€?" + encode + "]"  + CR;
292                            throw new RuntimeException( errMsg );
293                    }
294    
295                    String rtn = null;
296                    if( byteValue != null ) {
297                            try {
298                                    // encode コードで変換されてã�?‚‹ byte[] をã?String に変換ã€?
299                                    rtn = new String( byteValue,start,length,encode );
300                            } catch( UnsupportedEncodingException ex ) {      // 変換コードが存在しなã�?‚¨ラー
301                                    String errMsg = "æ–?­—変換コードが存在しませんã€?" + encode + "]" + CR
302                                                            + ex.getMessage() ;
303                                    throw new RuntimeException( errMsg,ex );
304                            }
305                    }
306                    return rtn;
307            }
308    
309            /**
310             * æŒ?®šã?æ–?­—å?をバイトコードに変換しますã?
311             * 引数のæ–?­—å?ã�?null の場合ã?、return は、byte[0] を返しますã?
312             *
313             * @param       value    変換するストリング値
314             * @param       encode   変換するæ–?­—エンコーãƒ?
315             *
316             * @return      変換後文字å?
317             */
318            public static byte[] makeByte( final String value,final String encode ) {
319                    byte[] rtnByte = new byte[0];
320                    if( value != null ) {
321                            try {
322                                    rtnByte = value.getBytes( encode );             // byte[] に encode コードで変換ã€?
323                            } catch( UnsupportedEncodingException ex ) {      // 変換コードが存在しなã�?‚¨ラー
324                                    String errMsg = "æ–?­—変換コードが存在しませんã€?" + encode + "]" + CR
325                                                            + ex.getMessage();
326                                    throw new RuntimeException( errMsg,ex );
327                            }
328                    }
329                    return rtnByte;
330            }
331    
332            /**
333             * 半角スペã?スで固定長(半角換算ã?数)に変換したæ–?­—å?を返しますã?
334             * 半角スペã?ス埋めは、文字が半角ã?全角混在でもかまã�?�¾せんã€?
335             * å†?ƒ¨にセãƒ?ƒˆしたæ–?­—å?は、変化しませんã€?
336             *
337             * @param       str      Fill埋めするæ–?­—å?
338             * @param       su_fill  Fill埋めするæ–?­—å?の長さã?(半角換算ã?数)
339             *
340             * @return      Fill埋めした新しいStringを返すã€?
341             */
342            public static String stringXFill( final String str,final int su_fill ) {
343                    char[] charValue ;
344    
345                    if( str == null ) { charValue = new char[0]; }
346                    else              { charValue = str.toCharArray(); }
347                    int len = charValue.length;
348    
349                    if( su_fill < len ) {
350                            String errMsg = "å…??æ–?­—数がフォーãƒ?‚ˆり長ã�?�§すã?(数字が壊れますã?)"
351                                            + "su_fill[" + su_fill + "], len[" + len + "]" + CR
352                                            + "input=[" + str + "]" + CR;
353                            throw new RuntimeException( errMsg );
354                    }
355    
356                    char[] charbuf = new char[ su_fill ];                   // 移ã�?char 配å?を新規作æ?
357                    Arrays.fill( charbuf,' ' );
358                    System.arraycopy( charValue,0,charbuf,0,len );
359    
360                    return new String( charbuf );            // コピã?した配å?全てを文字å?に変換
361            }
362    
363            /**
364             * 半角スペã?スで固定長(半角換算ã?数)に変換したæ–?­—å?を返しますã?
365             * 半角スペã?ス埋めは、文字が半角ã?全角混在でもかまã�?�¾せんã€?
366             * å†?ƒ¨にセãƒ?ƒˆしたæ–?­—å?は、変化しませんã€?
367             *
368             * @param       str      Fill埋めするæ–?­—å?
369             * @param       su_fill  Fill埋めするæ–?­—å?の長さã?(半角換算ã?数)
370             * @param       encode   Fill埋めするæ–?­—å?のæ–?­—エンコーãƒ?
371             *
372             * @return      Fill埋めした新しいStringを返すã€?
373             */
374            public static String stringFill( final String str,final int su_fill,final String encode ) {
375                    if( su_fill < 0 ) {
376                            String errMsg = "æŒ?®š文字数がè²?�§すã?[" + su_fill + "]";
377                            throw new RuntimeException( errMsg );
378                    }
379    
380                    byte[] byteValue = makeByte( str,encode );
381                    int len = byteValue.length;
382    
383                    // å†?ƒ¨æ–?­—å?が指定長より長ã�??å�?
384                    if( len >= su_fill ) {
385                            return makeString( byteValue,0,su_fill,encode );
386                    }
387                    else {
388                            byte[] space = makeByte( " ",encode );
389                            int spaceLen = space.length ;
390                            if( spaceLen == 4 ) {   // encode がã?UnicodeLittle の場合ã?特殊å?ç�?
391                                    space[0] = space[2];
392                                    space[1] = space[3];
393                                    spaceLen = 2;
394                            }
395                            byte[] bytebuf = new byte[ su_fill ];
396                            for( int i=0; i<len; i++ ) { bytebuf[i] = byteValue[i]; }
397    
398                            int k = 0;
399                            for( int j=len; j<su_fill; j++ ) {           // 余った部åˆ??、スペã?ス埋め
400                                    if( k >= spaceLen ) { k = 0; }
401                                    bytebuf[j] = space[k++];
402                            }
403                            return makeString( bytebuf,0,su_fill,encode );  // 新たに、すべての長さã?部åˆ?–‡字å?を作æ?するã€?
404                    }
405            }
406    
407            /**
408             * 整数のフォーãƒ? 12 で、整数部 ?‘2桁を表ã�?に合った新しいæ–?­—å?を作り、それを返しますã?
409             * 実行できるのは、整数の String に対してのみですã?
410             * å†?ƒ¨にセãƒ?ƒˆしたæ–?­—å?は、変化しませんã€?
411             *
412             *              String str = StringUtil.intFill( "123",10 );
413             *
414             *              実行結果??0000000123"
415             *
416             * @param       str     整数の String
417             * @param       su_fill フォーãƒ?‚’表す数å­?( 12 で、整数部 ?‘2桁を表ã�?
418             *
419             * @return      整数のフォーãƒ?�«合った文字å?
420             */
421            public static String intFill( final String str,final int su_fill ) {
422                    if( su_fill < 0 ) {
423                            String errMsg = "æŒ?®š文字数がè²?�§すã?[" + su_fill + "]";
424                            throw new RuntimeException( errMsg );
425                    }
426    
427                    char[] charbuf = new char[ su_fill ];                   // 移ã�?char 配å?を新規作æ?
428                    Arrays.fill( charbuf,'0' );
429    
430                    if( str == null ) { return new String( charbuf ); }
431    
432                    char[] charValue = str.toCharArray();
433                    int len = charValue.length;
434    
435                    if( su_fill < len ) {
436                            String errMsg = "å…??æ–?­—数がフォーãƒ?‚ˆり長ã�?�§すã?(数字が壊れますã?) su_fill[" + su_fill + "], len[" + len + "]";
437                            throw new RuntimeException( errMsg );
438                    }
439    
440                    System.arraycopy( charValue,0,charbuf,su_fill-len,len );
441    
442                    return new String( charbuf );            // コピã?した配å?全てを文字å?に変換
443            }
444    
445            /**
446             * 全角スペã?スで固定長(半角換算ã?数)に変換したæ–?­—å?を返しますã?
447             *
448             * @param       str      Fill埋めするæ–?­—å?
449             * @param       su_fill  Fill埋めするæ–?­—å?の長さã?(半角換算ã?数)
450             * @param       encode   Fill埋めするæ–?­—å?のæ–?­—エンコーãƒ?
451             *
452             * @return      全角スペã?スでFill埋めした新しいStringを返すã€?
453             */
454            public static String stringKFill( final String str,final int su_fill,final String encode ) {
455                    if( su_fill < 0 ) {
456                            String errMsg = "æŒ?®š文字数がè²?�§すã?[" + su_fill + "]";
457                            throw new RuntimeException( errMsg );
458                    }
459    
460                    byte[] byteValue = makeByte( str,encode );
461                    int len = byteValue.length;
462    
463                    // å†?ƒ¨æ–?­—å?が指定長より長ã�??å�?
464                    if( len >= su_fill ) {
465                            return makeString( byteValue,0,su_fill,encode );
466                    }
467                    else {
468                            byte[] space = makeByte( "�,encode );
469                            int spaceLen = space.length ;
470                            byte[] bytebuf = new byte[ su_fill ];
471                            for( int i=0; i<len; i++ ) { bytebuf[i] = byteValue[i]; }
472                            int k = 0;
473                            for( int j=len; j<su_fill; j++ ) {           // 余った部åˆ??、スペã?ス埋め
474                                    if( k >= spaceLen ) { k = 0; }
475                                    bytebuf[j] = space[k++];
476                            }
477                            return makeString( bytebuf,0,su_fill,encode );  // 新たに、すべての長さã?部åˆ?–‡字å?を作æ?するã€?
478                    }
479            }
480    
481            /**
482             * 小数点のフォーãƒ?�«合った新しいæ–?­—å?を作り、文字å?を返しますã?
483             * 現在は、小数点がé?に付いたり、最後に付く場合ã?対応ã?してã�?�¾せんã€?
484             * フォーãƒ??ã€?2.4 でã€?000000000010.1000 とã�?�†形で、ピリオドを含みますã?
485             *
486             *  // 半è§?整数部 10 æ¡?小数部 ?•桁で固定長のæ–?­—を得るã€?
487             *  String str = StringUtil.realFill( "123.45" ,10.5 ) ;
488             *
489             *  実行結果??000000123.45000
490             *
491             * @param       str             整数の String
492             * @param       su_fill フォーãƒ?‚’表す実数 ( 12.4 で、整数部 ?‘2桁ã?小数部 ?”æ¡?計17æ¡?)
493             *
494             * @return      value   小数点のフォーãƒ?–‡字å?
495             */
496            public static String realFill( final String str,final double su_fill ) {
497                    if( su_fill < 0 ) {
498                            String errMsg = "æŒ?®š文字数がè²?�§すã?[" + su_fill + "]";
499                            throw new RuntimeException( errMsg );
500                    }
501    
502                    int su_seisu = (int)(su_fill);                                             // æŒ?®šã?フォーãƒ??整数部を取りå?すã?
503                    int su_shosu = (int)(su_fill*10 - su_seisu*10);            // 小数部を取りå?しすã€?
504                    char[] charbuf = new char[ su_seisu + su_shosu + 1 ];  // 移ã�?char 配å?
505                    Arrays.fill( charbuf,'0' );
506    
507                    if( str == null ) {
508                            charbuf[su_seisu] = '.' ;
509                            return new String( charbuf );
510                    }
511    
512                    char[] charValue = str.toCharArray();
513                    int len = charValue.length;
514    
515                    // 検査するæ–?­—å?のåŠ?·¥(検査æ–?­—å?は、インãƒ?ƒƒクスの値とバイト数でæ–?­—数を求めるã?)
516                    // 小数点の位置を求めるã? 本当ã?、String クラスの indexOf で求めずã?byte[] で検索すべきであるã€?
517                    int valueindex = str.indexOf( '.' );
518                    if( valueindex < 0 ) {                                                                       // valueform 自体が、合ってã�?�ªã�??
519                            String errMsg = "å…??æ–?­—å?に小数点がã?含まれませんã€?;
520                            throw new RuntimeException( errMsg );
521                    }
522                    int su_valueseisu = valueindex;                                  // 整数部のæ–?­—数は、小数点の位置と同じ
523                    int su_valueshosu = len - valueindex - 1 ;              // 小数部のæ–?­—数は、å?æ–?­—数?�整数æ–?­—数?�ï¼?
524    
525                    // フォーãƒ??整数æ–?­—数 ー åŠ?·¥æ–?­—ã?整数æ–?­—部 ??転送å?配å?位置
526                    int to_index = su_seisu - su_valueseisu;
527                    if( to_index < 0 ) {
528                            String errMsg = "å…??数字が、フォーãƒ?‚ˆり長ã�?�§すã?(数字が壊れますã?) form[" + su_fill + "]";
529                            throw new RuntimeException( errMsg );
530                    }
531                    int end_index;
532                    // 転送å?配å?終äº?½�置は、お互いの小数部のæ–?­—数により、短ã�?–¹を選ぶã€?
533                    if( su_shosu < su_valueshosu ) { end_index = su_seisu + su_shosu + 1; }
534                    else                                               { end_index = su_seisu + su_valueshosu + 1; }
535    
536                    int from_index = 0;
537                    while( to_index < end_index ) {
538                            charbuf[to_index++] = charValue[from_index++];     // 転é€?移し替ã�?
539                    }
540                    return new String( charbuf );            // コピã?した配å?全てを文字å?に変換
541            }
542    
543            /**
544             * ストリングの部åˆ?–‡字å?ã‚?別のæ–?­—å?に置換えたストリングを返しますã?
545             * 例えば,リターンコードを&lt; br /&gt;に置換えて,画面上に改行表示させるが可能ですã?
546             *
547             * @og.rev 5.0.0.1 (2009/08/15) 不要なオブジェクトã?生æ?を抑制するã€?
548             *
549             * @param       target å…??æ–?­—å?
550             * @param       from   置換å?部åˆ?–‡字å?
551             * @param       to         置換å?部åˆ?–‡字å?
552             *
553             * @return      置換えた文字å?
554             */
555            public static String replace( final String target,final String from,final String to ) {
556                    if( target == null || from == null || to == null || target.indexOf( from ) < 0 ) { return target; }
557    
558                    StringBuilder strBuf = new StringBuilder( target.length() );
559    
560                    int start = 0;
561                    int end   = target.indexOf( from,start );
562                    while( end >= 0 ) {
563                            strBuf.append( target.substring( start,end ) );
564                            strBuf.append( to );
565                            start = end + from.length();
566                            end   = target.indexOf( from,start );
567                    }
568    
569                    if( start > 0 ) {
570                            strBuf.append( target.substring( start ) );
571                            return strBuf.toString();
572                    }
573                    else {
574                            return target;                  // 3.4.0.2 (2003/09/05)
575                    }
576            }
577    
578            /**
579             * 引数の AA:01 BB:02 CC:03 … 形式ã?、å?値:新値の?½?�゚ー?½区åˆ?‚Šæ–?­—å?をå?にã€?
580             * å…??を新値に置き換えますã?
581             * これはã€?ƒ¨åˆ?½®換ではなくã?完å?ä¸??で処ç�?�—ますã?
582             * caseStr ã�?null ã‚??マッチしなかったå?合ã?、å?の値を返しますã?
583             * そã?場合ã?ignoreCase=true としてã�?‚‹場合ã?、å?のæ–?­—å? も大æ–?­—に変換されて返されますã?
584             *
585             * ゼロæ–?­—å?をå?値ã‚?–°値で使用することは可能ですが、スペã?スを使用することはできませんã€?
586             *
587             * @og.rev 5.7.2.3 (2014/01/31) 新規追åŠ?
588             *
589             * @param       target          å…??æ–?­—å?
590             * @param       caseStr         置換リスãƒ?AA:01 BB:02 CC:03 … 形å¼?。null の場合ã?、比è¼?�—なã�??
591             * @param       ignoreCase      true:大æ–?­—として比è¼?/ false:そã?まま比è¼?
592             *
593             * @return      å…??æ–?­—å?を置き換えた結果。置換リストに存在しなければ、å?のæ–?­—å?を返すã€?
594             */
595            public static String caseReplace( final String target,final String caseStr,final boolean ignoreCase ) {
596                    if( target == null ) { return target; }
597    
598                    String rtn = ignoreCase ? target.toUpperCase(Locale.JAPAN) : target ;
599    
600                    if( caseStr != null ) {
601                            String caseTmp = " " + caseStr.trim() + " " ;           // CASEæ–?­—å?の形式をそろえるã€?
602    
603                            int adrs = caseTmp.indexOf( " " + rtn + ":" );          // 前スペã?スと後ろコロンで、単語を確定するã?
604                            if( adrs >= 0 ) {
605                                    int st = caseTmp.indexOf( ':' , adrs+1 );               // æœ??のコロンの位置。å?値:新値 の 新値 の取å?
606                                    int ed = caseTmp.indexOf( ' ' , st+1 );                 // コロンの次から、最初ã?スペã?スの位置
607                                    if( st >= 0 && ed >= 0 ) {
608                                            rtn = caseTmp.substring( st+1,ed );                     // コロンの次から、スペã?スの前までをå?りå?すã?
609                                    }
610                            }
611                    }
612    
613                    return rtn ;
614            }
615    
616            /**
617             * String型ã?配å?から、カンãƒ?,)で連結されたString を作æ?しますã?
618             * これは?Œé?列を表示用に変換する為のもã?ですã?
619             * array2line( array, ",", 0 ); と同等ですã?
620             *
621             * @param       array           å…??æ–?­—å?配å?
622             *
623             * @return      ä¸??に変換したæ–?­—å?(引数がnullの場合ã?ã€?•·さ0ã?æ–?­—å?を返す)
624             */
625            public static String array2csv( final String[] array ) {
626                    return array2line( array, ",", 0 );
627            }
628    
629            /**
630             * String型ã?配å?から、セパレーターで連結されたString を作æ?しますã?
631             * これは?Œé?列を表示用に変換する為のもã?ですã?
632             *
633             * @param       array           å…??æ–?­—å?配å?
634             * @param       separator       区åˆ?‚Š記号
635             *
636             * @return      ä¸??に変換したæ–?­—å?(引数がnullの場合ã?ã€?•·さ0ã?æ–?­—å?を返す)
637             */
638            public static String array2line( final String[] array,final String separator ) {
639                    return array2line( array, separator,0 );
640            }
641    
642            /**
643             * String型ã?配å?から、セパレーターで連結されたString を作æ?しますã?
644             * これは?Œé?列を表示用に変換する為のもã?ですã?
645             *
646             * @param       array           å…??æ–?­—å?配å?
647             * @param       separator       区åˆ?‚Š記号
648             * @param       start           配å?の連結開始アドレス
649             *
650             * @return      ä¸??に変換したæ–?­—å?(引数がnullの場合ã?ã€?•·さ0ã?æ–?­—å?を返す)
651             */
652            public static String array2line( final String[] array,final String separator,final int start ) {
653                    if( array == null || array.length <= start ) { return ""; }
654    
655                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
656    
657                    rtn.append( valueOf( array[start] ) );
658                    for(int i=start+1; i < array.length; i++) {
659                            rtn.append( separator );
660                            rtn.append( valueOf( array[i] ) );
661                    }
662                    return rtn.toString();
663            }
664    
665            /**
666             * Enumerationから、オブジェクトé?列データを返しますã?
667             * これは?ŒEnumerationを表示用に変換する為のもã?ですã?
668             *
669             * @param       enume   å…??Enumeration
670             *
671             * @return      オブジェクトé?åˆ?
672             */
673            public static Object[] enume2Array( final Enumeration<?> enume ) {                // 4.3.3.6 (2008/11/15) Generics警告対å¿?
674                    if( enume == null || ! enume.hasMoreElements() ) { return new Object[0]; }
675    
676                    ArrayList<Object> obj = new ArrayList<Object>();
677    
678                    while( enume.hasMoreElements() ) {
679                            obj.add( enume.nextElement() );
680                    }
681                    return obj.toArray();
682            }
683    
684            /**
685             * Enumerationから、オブジェクトé?列データを返しますã?
686             * これは?ŒEnumerationを表示用に変換する為のもã?ですã?
687             *
688             * @param       enume   å…??Enumeration
689             * @param       objs - 配å?が十åˆ?�ª大きさを持つ場合ã?、Vector の要ç´?�Œ格納される配å?ã€?
690             *                      そうでなã�??合ã?、要ç´?‚’格納するために同じ実行時の型ã?新しい配å?が割り当てられã‚?
691             * @return      オブジェクトé?åˆ?
692             */
693            public static Object[] enume2Array( final Enumeration<?> enume,final Object[] objs ) {    // 4.3.3.6 (2008/11/15) Generics警告対å¿?
694                    if( enume == null || ! enume.hasMoreElements() ) { return objs ; }
695    
696                    ArrayList<Object> list = new ArrayList<Object>();
697    
698                    while( enume.hasMoreElements() ) {
699                            list.add( enume.nextElement() );
700                    }
701                    return list.toArray( objs );
702            }
703    
704            /**
705             * Iteratorから、セパレーターで連結されたString を作æ?しますã?
706             * これは?ŒEnumerationを表示用に変換する為のもã?ですã?
707             *
708             * @param       ite             å…??Iterator
709             * @param       separator       区åˆ?‚Š記号
710             *
711             * @return      ä¸??に変換したæ–?­—å?
712             */
713            public static String iterator2line( final Iterator<?> ite,final String separator ) {
714                    if( ite == null || ! ite.hasNext() ) { return ""; }
715    
716                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
717    
718                    rtn.append( valueOf( ite.next() ) );
719                    while( ite.hasNext() ) {
720                            rtn.append( separator );
721                            rtn.append( valueOf( ite.next() ) );
722                    }
723                    return rtn.toString();
724            }
725    
726            /**
727             * カンãƒ?,)で連結された String をã?配å?にåˆ?§£して、その値を返しますã?
728             * これは?Œたとえã?、AAA,BBB,CCC などのリソースãƒ??タを受けてから配å?に入れ直してã€?
729             * メニューなりリストを作æ?するのに便利ですã?
730             * 要ç´?�Œ空の場合ã?、å¿?�šカンマã?間にスペã?スをå?れて記述してくださいã€?
731             * åˆ?‰²後ã?æ–?­—å?の前後ã?スペã?スは、削除されますã?
732             *
733             * @param       csvData         å…??ãƒ??タ
734             *
735             * @return      æ–?­—å?配å?(引数がnull、ゼロæ–?­—å?の場合ã?、サイズ0の配å?を返す)
736             */
737            public static String[] csv2Array( final String csvData ) {
738                    return csv2Array( csvData, ',', 0 );
739            }
740    
741            /**
742             * 区åˆ?‚Šæ–?­—で連結された String をã?配å?にåˆ?§£して、その値を返しますã?
743             * これは?Œたとえã?、AAA,BBB,CCC などのリソースãƒ??タを受けてから配å?に入れ直してã€?
744             * メニューなりリストを作æ?するのに便利ですã?
745             * 連続した区åˆ?‚Šæ–?­—ã?ã€?¼‘文字にåˆ?‰²しますã?
746             * åˆ?‰²後ã?æ–?­—å?の前後ã?スペã?スは、削除されますã?
747             *
748             * @param       csvData         å…??ãƒ??タ
749             * @param       separator       区åˆ?‚Šæ–?­?
750             *
751             * @return      æ–?­—å?配å?(引数がnull、ゼロæ–?­—å?の場合ã?、サイズ0の配å?を返す)
752             */
753            public static String[] csv2Array( final String csvData,final char separator ) {
754                    return csv2Array( csvData,separator,0 );
755            }
756    
757            /**
758             * 区åˆ?‚Šæ–?­—で連結された String をã?配å?にåˆ?§£して、その値を返しますã?
759             * これは?Œたとえã?、AAA,BBB,CCC などのリソースãƒ??タを受けてから配å?に入れ直してã€?
760             * メニューなりリストを作æ?するのに便利ですã?
761             * 連続した区åˆ?‚Šæ–?­—ã?ã€?¼‘文字にåˆ?‰²しますã?
762             * åˆ?‰²後ã?æ–?­—å?の前後ã?スペã?スは、削除されますã?
763             * 第?“ã?引数は、リターンする配å?の個数を指定しますã?ただしã?第ä¸?¼•数がNULLã‚??ゼロæ–?­—å?
764             * などの不正なæƒ??の場合ã?ã€??常と同じã�?長さゼロの配å?を返しますã?
765             * len=0 を指定するとåˆ?§£したãƒ??タの個数åˆ??配å?を作æ?しますã?æŒ?®šã?長さが短ã�??合ã?ã€?
766             * そこまでåˆ??み取り込みますã?æŒ?®šã?長さが長ã�??合ã?、余å?に配å?を作æ?しますã?
767             * セãƒ?ƒˆされるå?はã€?" ですã?
768             *
769             * @og.rev 3.8.5.1 (2006/05/08) 設定é?列ã?数を指定できるように変更
770             * @og.rev 3.8.8.2 (2007/01/26) åˆ?‰²後ã?値の前後ã?スペã?スは削除しますã?
771             *
772             * @param       csvData         å…??ãƒ??タ
773             * @param       separator       区åˆ?‚Šæ–?­?
774             * @param       len                     æŒ?®šã?長さã?配å?で返しますã?
775             *
776             * @return      æ–?­—å?配å?(引数がnull、ゼロæ–?­—å?の場合ã?、サイズ0の配å?を返す)
777             */
778            public static String[] csv2Array( final String csvData,final char separator, final int len ) {
779                    if( csvData == null || csvData.length() == 0 ) { return new String[0] ; }
780    
781                    CSVTokenizer token = new CSVTokenizer( csvData,separator );
782    
783                    int count = (len > 0 ) ? len : token.countTokens() ;
784                    String[] rtn = new String[ count ];
785                    int i = 0;
786                    for( ; i<count && token.hasMoreTokens() ; i++ ) {
787                            rtn[i] = token.nextToken().trim();      // 3.8.8.2 (2007/01/26)
788                    }
789                    for( ; i<count; i++ ) {
790                            rtn[i] = "" ;
791                    }
792    
793                    return rtn;
794            }
795    
796            /**
797             * 区åˆ?‚Šæ–?­—で連結された String をã?配å?にåˆ?§£して、その値を返しますã?
798             * これは?Œたとえã?、AAA,BBB,CCC などのリソースãƒ??タを受けてから配å?に入れ直してã€?
799             * メニューなりリストを作æ?するのに便利ですã?
800             * csv2Array と異なりã?連続した区åˆ?‚Šæ–?­—ã?、å?割せずにトã?クンのみåˆ?‚Š出しますã?
801             * トã?クンは、カンãƒ?,)のみで区åˆ?‚Š、そのå¾?trim() により
802             * 前後ã?スペã?スを削除しますã?
803             *
804             * @param       csvData         å…??ãƒ??タ
805             *
806             * @return      æ–?­—å?配å?
807             */
808            public static String[] csv2ArrayOnly( final String csvData ) {
809                    if( csvData == null || csvData.length() == 0 ) { return new String[0] ; }
810    
811                    StringTokenizer token = new StringTokenizer( csvData,"," );
812    
813                    ArrayList<String> list = new ArrayList<String>();
814                    while( token.hasMoreTokens() ) {
815                            String temp = token.nextToken().trim();
816                            if( temp.length() > 0 ) { list.add( temp ); }
817                    }
818    
819                    return list.toArray( new String[list.size()] );
820            }
821    
822            /**
823             * カンãƒ?,)、ハイフン(-)で連結された String をã?配å?にåˆ?§£して、その値を返す処ç�??スペシャル版ですã?
824             * 0,1,3,5-8,10-* などの数字文字å?から、å¿?¦�な数字をピックアãƒ??したæ–?­—é?列を返しますã?
825             * 引数の maxNo はã€?*" が指定された場合ã?、最大の数値ですã?
826             * よってã€?*" は、単独(?‘文å­?ではã€?-maxNo を表しã?N-* では、N-maxNo を意味しますã?
827             * カンマ区åˆ?‚ŠでæŒ?®šされる値は、基本çš?�«数字でã€?‡�è¤?1,1,2,2)ã€??転(3,2,1)でæŒ?®šできますã?
828             * 5-3 とæŒ?®šしたå?合ã?ã€?,4,3 にåˆ?§£されますã?é€??に登録されますã?
829             * またã?ä¸?–‡字だけã?場合ã?、アルファベッãƒ?a-z,A-Zなど)も指定する事が可能ですã?
830             * アルファベットã?場合ã?ã€?*" はæŒ?®šできませんã€?
831             * 重è¤?‰Š除、æ?é ?¸¦べ替え等が、å¿?¦�な場合ã?、取得後ã?配å?を操作してくださいã€?
832             *
833             * @og.rev 5.5.7.2 (2012/10/09) 新規追åŠ?
834             *
835             * @param       csvData 0,1,3,5-8,10-* などのCSV-ハイフンæ–?­—å?
836             * @param       maxNo "*" が指定された場合ã?、最大数
837             * @return      æ–?­—å?配å?(引数がnull、ゼロæ–?­—å?の場合ã?、サイズ0の配å?を返す)
838             */
839            public static String[] csv2ArrayExt( final String csvData , final int maxNo )  {
840                    if( csvData == null || csvData.length() == 0 ) { return new String[0] ; }
841    
842                    String strData = csvData.replace( "-*" , "-" + maxNo );         // まずã?N-* 形式を、N-maxNo に変換しますã?
843                    strData        = strData.replace( "*"  , "0-" + maxNo );        // そã?後ã?"*" 単独(?‘文å­?をã?0-maxNo に変換しますã?
844    
845                    ArrayList<String> noList = new ArrayList<String>();
846    
847                    String[] nos = strData.split( "," );            // カンマでåˆ?§£ã€? , N-M , N-* のどれか
848                    for( int i=0; i<nos.length; i++ ) {
849                            String sno = nos[i] ;
850                            int hai = sno.indexOf( '-' );
851                            // ハイフンが含まれてã�?‚‹ときã?前後にåˆ?§£してã€?–“を埋める
852                            if( hai > 0 ) {
853                                    String st1 = sno.substring( 0,hai );    // 先é?からハイフンまで
854                                    String st2 = sno.substring( hai+1 );    // ハイフンからæœ?¾Œまで
855                                    if( st1.length() == 1 &&  st2.length() == 1 ) {         // ともに?‘文字ã?場合ã?、char化して処ç�??(英数字å?ç�?
856                                            char ch1 = st1.charAt(0);
857                                            char ch2 = st2.charAt(0);
858                                            if( ch1 < ch2 ) { while( ch1 <= ch2 ) { noList.add( String.valueOf(ch1++) ); } }
859                                            else                    { while( ch1 >= ch2 ) { noList.add( String.valueOf(ch1--) ); } }
860                                    }
861                                    else {
862                                            int ch1 = Integer.parseInt( st1 );
863                                            int ch2 = Integer.parseInt( st2 );
864                                            if( ch1 < ch2 ) { while( ch1 <= ch2 ) { noList.add( String.valueOf(ch1++) ); } }
865                                            else                    { while( ch1 >= ch2 ) { noList.add( String.valueOf(ch1--) ); } }
866                                    }
867                            }
868                            else {
869                                    noList.add( String.valueOf(sno) );
870                            }
871                    }
872                    return noList.toArray( new String[noList.size()] ) ;
873            }
874    
875            /**
876             * Object 引数のæ–?­—å?表現を返しますã?
877             * これは?ŒString.valueOf とほぼ同じ動作をしますが、引数ã�?null の場合にã€?
878             * "null" とã�?�†æ–?­—å?を返すのではなくã?なにもなã�?–‡字å? "" を返しますã?
879             *
880             * @param       obj    æ–?­—å?表現すべきå?のオブジェクãƒ?
881             *
882             * @return      引数ã�?null の場合ã?ã€?" に等しã�?–‡字å?。そã�?�§なã�??合ã?、obj.toString() の値
883             */
884            public static String valueOf( final Object obj ) {
885                    if( obj == null ) { return "";                     }
886                    else                      { return obj.toString(); }
887            }
888    
889            /**
890             * HTML上ã?エスケープ文字を変換しますã?
891             *
892             * HTMLで表示する場合にきちんとエスケープ文字に変換しておかなã�?�¨
893             * Script を実行されたりã?不要なHTMLコマンドを潜り込まされたりするためã€?
894             * セキュリãƒ?‚£ーホã?ルになる可能性があるã?で、注意してくださいã€?
895             *
896             * @param       input HTMLエスケープ前のæ–?­—å?
897             *
898             * @return      エスケープ文字に変換後ã?æ–?­—å?
899             */
900            public static String htmlFilter( final String input ) {
901                    if( input == null || input.length() == 0 ) { return ""; }
902                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
903                    char ch;
904                    for(int i=0; i<input.length(); i++) {
905                            ch = input.charAt(i);
906                            switch( ch ) {
907                                    case '<'  : rtn.append("&lt;");   break;
908                                    case '>'  : rtn.append("&gt;");   break;
909                                    case '"'  : rtn.append("&quot;"); break;
910                                    case '\'' : rtn.append("&#39;");  break;
911                                    case '&'  : rtn.append("&amp;");  break;
912                                    default   : rtn.append(ch);
913                            }
914                    }
915                    return rtn.toString() ;
916            }
917            
918            /**
919             * XML上ã?エスケープ文字を変換しますã?
920             * 
921             * HTMLとの違いはアポストロフィですã?
922             *
923             * @og.rev 5.8.2.2 (2014/12/19) 新規作æ?
924             *
925             * @param       input XMLエスケープ前のæ–?­—å?
926             *
927             * @return      エスケープ文字に変換後ã?æ–?­—å?
928             */
929            public static String xmlFilter( final String input ) {
930                    if( input == null || input.length() == 0 ) { return ""; }
931                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
932                    char ch;
933                    for(int i=0; i<input.length(); i++) {
934                            ch = input.charAt(i);
935                            switch( ch ) {
936                                    case '<'  : rtn.append("&lt;");   break;
937                                    case '>'  : rtn.append("&gt;");   break;
938                                    case '"'  : rtn.append("&quot;"); break;
939                                    case '\'' : rtn.append("&apos;");  break;
940                                    case '&'  : rtn.append("&amp;");  break;
941                                    default   : rtn.append(ch);
942                            }
943                    }
944                    return rtn.toString() ;
945            }
946    
947            /**
948             * JavaScript 等ã?引数でのクオート文字をASCII変換しますã?
949             *
950             * JavaScript の引数の値に、ダブルクオーãƒ?")、シングルクオーãƒ?')ã�?
951             * 含まれると、文字å?を表す為に前後にæŒ?®šしてã�?‚‹クオートと混乱しã?
952             * ãƒ??タを表現できなã�?‚±ースがありますã?そã?場合には、クオート文字を
953             * ASCIIæ–?­—に置き換える事で、指定ã?æ–?­—を渡すことが可能になりますã?
954             * ここでは、引数æ–?­—å?に、ダブルクオーãƒ?")、シングルクオーãƒ?')がã?
955             * 含まれると、それぞれã?ASCII コーãƒ??¥?˜22ã??¥?˜2ï¼?に置き換えますã?
956             * なおã?null は、ゼロæ–?­—å?に変換して返しますã?
957             *
958             * @param       input 入力文字å?
959             *
960             * @return      クオート文字をASCIIæ–?­—に置き換えたæ–?­—å?
961             */
962            public static String quoteFilter( final String input ) {
963                    if( input == null || input.length() == 0 ) { return ""; }
964                    if( input.indexOf( '\'' ) < 0 && input.indexOf( '"' ) < 0 ) { return input; }
965    
966                    StringBuilder rtn = new StringBuilder();
967                    char ch;
968                    for(int i=0; i<input.length(); i++) {
969                            ch = input.charAt(i);
970                            switch( ch ) {
971                                    case '"'  : rtn.append( "\\x22" ); break;
972                                    case '\'' : rtn.append( "\\x27" ); break;
973                                    default   : rtn.append( ch );
974                            }
975                    }
976                    return rtn.toString() ;
977            }
978    
979            /**
980             * æ‰?®šã?キャラクタコードを取り除ã�?�Ÿæ–?­—å?を作æ?しますã?
981             *
982             * 実現したã�?©Ÿè?は、String#replace( 'x','' ) çš?�ª表現ですã?
983             * つまりã?æŒ?®šã?キャラクタを取り除きたã�??ですが、上記コマンドではã€?
984             * コンパイル時にエラーが発生しますã?
985             * 取り除きたã�?‚­ャラクタコードが存在しなã�??合ã?、指定ã?æ–?­—å?ã‚?
986             * そã?まま返しますã?
987             *
988             * @param       value 処ç�?¯¾象のæ–?­—å?
989             * @param       ch 取り除きたã�?‚­ャラクタ
990             *
991             * @return      処ç�?¾Œã?æ–?­—å?
992             */
993            public static String deleteChar( final String value,final char ch ) {
994                    if( value == null || value.indexOf( ch ) < 0 ) { return value; }
995                    char[] chs = value.toCharArray() ;
996                    int j=0;
997                    for( int i=0;i<chs.length; i++ ) {
998                            if( chs[i] == ch ) { continue; }
999                            chs[j] = chs[i];
1000                            j++;
1001                    }
1002                    return String.valueOf( chs,0,j );
1003            }
1004    
1005            /**
1006             * æ–?­—å?に含まれる、特定ã?æ–?­—ã?個数をカウントして返しますã?
1007             *
1008             * @og.rev 5.2.0.0 (2010/09/01)
1009             *
1010             * @param       value 処ç�?¯¾象のæ–?­—å?
1011             * @param       ch カウントする文å­?
1012             *
1013             * @return      カウント数
1014             */
1015            public static int countChar( final String value,final char ch ) {
1016                    if( value == null || value.indexOf( ch ) < 0 ) { return 0; }
1017                    char[] chs = value.toCharArray() ;
1018                    int cnt=0;
1019                    for( int i=0;i<chs.length; i++ ) {
1020                            if( chs[i] == ch ) { cnt++; }
1021                    }
1022                    return cnt;
1023            }
1024    
1025            /**
1026             * CODE39 の æ–?­—å?を作æ?しますã?
1027             *
1028             * CODE39 は、ã?0??, A?žZ,-,・,ã€?$,/,+,%』ã?コードが使用できる
1029             * バã?コードã?体系ですã?通常 * で始まã‚?* で終äº?�—ますã?
1030             * またã?チェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆ に、モジュラス43 が使われますã?
1031             * ここでは、指定ã?æ–?­—å?の前後にã€? を付与し、å¿?¦�であれば
1032             * チェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆも付与しますã?
1033             * æŒ?®šã?入力文字å?にはã€? を付けなã�?�§くださいã€?
1034             *
1035             * @param       value 処ç�?¯¾象のæ–?­—å?
1036             * @param       checkDigit チェãƒ?‚¯ãƒ?‚¸ãƒ?ƒˆの付ä¸?true:付けã‚?false:付けなã�?
1037             *
1038             * @return      処ç�?¾Œã?æ–?­—å?
1039             */
1040            public static String code39( final String value,final boolean checkDigit ) {
1041                    String rtn = ( value == null ) ? "" : value ;
1042                    if( ! checkDigit ) { return "*" + rtn + "*"; }
1043    
1044                    int kei = 0;
1045                    int cd;
1046                    for( int i=0; i<rtn.length(); i++ ) {
1047                            cd = MODULUS_43.indexOf( rtn.charAt(i) );
1048                            if( cd < 0 ) {
1049                                    String errMsg = "æŒ?®šã?æ–?­—中に、CODE39 規定外文字が使用されてã�?�¾すã?[" + rtn.charAt(i) + "]" ;
1050                                    throw new RuntimeException( errMsg );
1051                            }
1052                            kei += cd ;
1053                    }
1054                    char digit = MODULUS_43.charAt( kei % 43 );
1055    
1056                    return "*" + rtn + digit + "*" ;
1057            }
1058    
1059            /**
1060             * 引数 in がã?null またã?、ゼロæ–?­—å?の場合ã??¤ãƒ?ƒ•ォルトå? def を返しますã?
1061             * もちろん、in ã‚?def ã‚?null の場合ã??¤null を返しますã?
1062             *
1063             * @param    in 基準となる文字å?
1064             * @param    def ãƒ?ƒ•ォルト文字å?
1065             *
1066             * @return   ( in != null ) ? in : def ;
1067             */
1068            public static String nval( final String in,final String def ) {
1069                    return ( in == null || in.length() == 0 ) ? def : in ;
1070            }
1071    
1072            /**
1073             * 引数 in がã?null またã?、ゼロæ–?­—å?の場合ã??¤ãƒ?ƒ•ォルトå? def を返しますã?
1074             *
1075             * @param    in 基準となる文字å?
1076             * @param    def ãƒ?ƒ•ォルト数å­?
1077             *
1078             * @return   引数 in を変換した数字ã?変換できなã�??合ã? ãƒ?ƒ•ォルトå? def
1079             */
1080            public static int nval( final String in,final int def ) {
1081                    return ( in == null || in.length() == 0 ) ? def : Integer.parseInt( in ) ;
1082            }
1083    
1084            /**
1085             * 引数 in がã?null またã?、ゼロæ–?­—å?の場合ã??¤ãƒ?ƒ•ォルトå? def を返しますã?
1086             *
1087             * @param    in 基準となる文字å?
1088             * @param    def ãƒ?ƒ•ォルト数å­?
1089             *
1090             * @return   引数 in を変換した数字ã?変換できなã�??合ã? ãƒ?ƒ•ォルトå? def
1091             */
1092            public static long nval( final String in,final long def ) {
1093                    return ( in == null || in.length() == 0 ) ? def : Long.parseLong( in ) ;
1094            }
1095    
1096            /**
1097             * 引数 in がã?null またã?、ゼロæ–?­—å?の場合ã??¤ãƒ?ƒ•ォルトå? def を返しますã?
1098             * 通常はã€?true" またã?ã€?"TRUE" æ–?­—å?をã?論理値の true に変換しますã?
1099             * ただしã?æ–?­—å?長ã�?1æ–?­—ã?場合ã?みã€?0" 以外を true に変換しますã?
1100             *
1101             * @param    in 基準となる文字å?
1102             * @param    def ãƒ?ƒ•ォルト論理値
1103             *
1104             * @return   引数 in を変換した論理値。変換できなã�??合ã? ãƒ?ƒ•ォルトå? def
1105             */
1106            public static boolean nval( final String in,final boolean def ) {
1107                    boolean rtn = def;
1108                    if( in != null && in.length() != 0 ) {
1109                            rtn = "true".equalsIgnoreCase( in )  ;
1110                            if( in.length() == 1 ) { rtn = ! "0".equals( in ); }
1111                    }
1112                    return rtn ;
1113            }
1114    
1115            /**
1116             * 引数 in がã?nullã€?_"、ゼロæ–?­—å?の場合ã??¤ãƒ?ƒ•ォルトå? def を返しますã?
1117             *
1118             * さらに、メモリ領域をç¯?´?�™る為、intern() の結果を返しますã?
1119             *
1120             * @og.rev  5.2.2.0 (2010/11/01) "_" の取り扱ã�?¤‰更
1121             *
1122             * @param    in 基準となる文字å?
1123             * @param    def ãƒ?ƒ•ォルト文字å?
1124             *
1125             * @return  nullã€?_"、ゼロæ–?­—å?の場合ã?、デフォルト文字å?をã?そうでなければ、å?力文字を返すã€?
1126             */
1127            public static String nval2( final String in,final String def ) {
1128                    return ( in == null || in.length() == 0 || "_".equals( in ) ) ? def : in.intern() ;
1129            }
1130    
1131            /**
1132             * 引数 in がã?null またã?、ゼロæ–?­—å?の場合ã??¤ãƒ?ƒ•ォルトå? def を返しますã?
1133             * ただしã?NULL代替æ–?­?_)は ãƒ?ƒ•ォルトå? def2 に置き換えますã?
1134             *
1135             * さらに、メモリ領域をç¯?´?�™る為、intern() の結果を返しますã?
1136             *
1137             * @og.rev  5.2.2.0 (2010/11/01) "_" の取り扱ã�?¤‰更
1138             *
1139             * @param    in 基準となる文字å?
1140             * @param    def ãƒ?ƒ•ォルト文字å?
1141             * @param    def2 NULL代替æ–?­?_)の場合ã?ãƒ?ƒ•ォルト文字å?
1142             *
1143             * @return  NULLæ–?­—å?関係ã?場合ã?、ゼロæ–?­—å?をã?そうでなければ、å?力文字を返すã€?
1144             */
1145            public static String nval2( final String in,final String def,final String def2 ) {
1146                    return ( in == null || in.length() == 0 ) ? def : ( "_".equals( in ) ? def2 : in.intern() ) ;
1147            }
1148    
1149            /**
1150             * 引数 in がã?null またã?、ゼロæ–?­—å?、またã?すべて空白æ–?­—ã?場合ã??¤true を返しますã?
1151             * それ以外ã? false を返しますã?
1152             *
1153             * 注意ã?、オールスペã?スã‚?‚¿ブ文字ã?改行文字も true になりますã?
1154             *
1155             * @param    in 基準となる文字å?
1156             *
1157             * @return  NULLæ–?­—å?関係ã?場合ã?、true をã?そうでなければ、false を返すã€?
1158             */
1159            public static boolean isNull( final String in ) {
1160                    if( in == null || in.length() == 0 ) { return true; }
1161    
1162                    // String.trim().length()==0 の高é?ç‰?
1163                    for( int i=0; i<in.length(); i++ ) {
1164                            if( !Character.isWhitespace( in.charAt(i) ) ) {
1165                                    return false;
1166                            }
1167                    }
1168                    return true;
1169            }
1170    
1171            /**
1172             * Throwable の printStackTrace() 結果を文字å?に変換して返しますã?
1173             *
1174             * @param    th   printStackTraceすべきå?のThrowableオブジェクãƒ?
1175             *
1176             * @return   Throwableの詳細メãƒ?‚»ージ( th.printStackTrace() )
1177             */
1178            public static String stringStackTrace( final Throwable th ) {
1179                    if( th == null ) { return null; }
1180    
1181                    StringWriter sw = new StringWriter();
1182                    th.printStackTrace( new PrintWriter( sw ) );
1183    
1184                    return String.valueOf( sw );
1185            }
1186    
1187            /**
1188             * Throwable の printStackTrace() 結果のå†??opengion に関するç®?‰€ã�?�‘を文字å?に変換して返しますã?
1189             *
1190             * printStackTrace() すると、è?大なメãƒ?‚»ージが表示されるためã?そã?中のã€?org.opengion" ã‚?
1191             * 含ã‚?®?‰€ã�?�‘をã?抜粋しますã?
1192             *
1193             * @og.rev 5.7.2.0 (2014/01/10) 新規作æ?
1194             *
1195             * @param    th å…??Throwableオブジェクãƒ?
1196             *
1197             * @return   Throwableの詳細メãƒ?‚»ージ( StackTraceElement の抜ç²?)
1198             */
1199            public static String ogStackTrace( final Throwable th ) {
1200                    if( th == null ) { return null; }
1201    
1202                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
1203    
1204                    StackTraceElement[] eles = th.getStackTrace();
1205                    if( eles.length > 0 ) {
1206                            rtn.append( "  " ).append( eles[0].toString() ).append( CR );
1207                    }
1208    
1209                    for( int i=1; i<eles.length; i++ ) {
1210                            String cls = eles[i].getClassName();
1211                            if( cls.indexOf( "org.opengion" ) >= 0 ) {
1212                                    rtn.append( "    at " ).append( eles[i].toString() ).append( CR );
1213                            }
1214                    }
1215    
1216                    return rtn.toString();
1217            }
1218    
1219            /**
1220             * 大きな浮動小数点数につã�?�¦、カンマ編é›?‚’行いますã?
1221             *
1222             * こã?メソãƒ?ƒ‰ではã€?.23 E12 などの数字ã?扱ã�?�¾せん。é?常の
1223             * 数字とピリオドで構æ?された文字å?のみ、変換対象になりますã?
1224             * (ただしã?不正なæ–?­—å?を与えてもエラーチェãƒ?‚¯はしてã�?�¾せんã€?
1225             * minFraction には、少数点部に与える固定å?を指定しますã?入力文字å?ã�?
1226             * そã?桁数より少なã�??合ã?ã€?¼�埋めしますã?
1227             * 多い場合でもカãƒ?ƒˆしませんã€?
1228             * minFraction ã�?0 の場合ã?、少数点は付きませんã€?
1229             * ".12" などの少数点は、å¿?�š先é?に 0 が付きますã?
1230             * 入力文字å?ã�?null かã?ゼロæ–?­—å?時ã?、そのまま入力データを返しますã?
1231             *
1232             * <pre>
1233             *      DecimalFormat format = new DecimalFormat( "#,##0.00########" );
1234             *      double dd = Double.parseDouble( val );
1235             *      return format.format( dd );
1236             * </pre>
1237             * に対して、minFractionåˆ??少数以下ã?ゼロのæŒ?®šと、inに ',' ã�?
1238             * 含まれた処ç�?‚’追åŠ?�—た感じになりますã?
1239             *
1240             * @og.rev  4.0.0.0 (2007/10/26) 空白のトリãƒ??ç�?‚’追åŠ?
1241             *
1242             * @param       in              変換å…??æ–?­—å?
1243             * @param       minFraction     変換時ã?少数点以下ã?固定桁数
1244             *
1245             * @return      カンマ編é›?¾Œã?数字型æ–?­—å?
1246             */
1247            public static String numberFormat( final String in, final int minFraction ) {
1248                    if( in == null || in.length() == 0 ) { return in ; }
1249    
1250                    // 4.0.0.0 (2007/10/26)
1251                    String tmp = in.trim();
1252    
1253                    if( tmp.length() == 0 ) { return tmp ; }
1254    
1255                    char[] chs = tmp.toCharArray();
1256                    int pos = 0;
1257    
1258                    // 整数部の設å®?
1259                    boolean firstZero = true;
1260                    StringBuilder buf1 = new StringBuilder();
1261                    while( pos < chs.length ) {
1262                            char ch = chs[pos++];
1263                            if( ch == '.' ) { break; }
1264                            else if( ch != '-' && ch != ',' && ( ch != '0' || !firstZero )) {
1265                                    buf1.append( ch );
1266                                    firstZero = false;
1267                            }
1268                    }
1269                    if( buf1.length() == 0 ) {
1270                            buf1.append( '0' );
1271                    }
1272    
1273                    for( int i=buf1.length()-3; i>0; i-=3 ) {
1274                            buf1.insert( i,',' );
1275                    }
1276                    if( chs[0] == '-' ) { buf1.insert( 0,'-' ); }
1277    
1278                    // 少数部の設å®?
1279                    // 3.6.0.3 (2004/10/05) 桁数が多い場合でもカãƒ?ƒˆしなã�?
1280                    StringBuilder buf2 = new StringBuilder();
1281                    while( pos < chs.length ) {
1282                            buf2.append( chs[pos++] );
1283                    }
1284    
1285                    while( buf2.length() < minFraction ) {
1286                            buf2.append( '0' );
1287                    }
1288    
1289                    if( buf2.length() > 0 ) {
1290                            buf1.append( '.' ).append( buf2 );
1291                    }
1292    
1293                    return buf1.toString();
1294            }
1295    
1296            /**
1297             * 識別id に応じã�?オブジェクトを作æ?しますã?
1298             * 作æ?するには、デフォルトコンストラクターがå¿?¦�ですã?
1299             *
1300             * @param       cls 作æ?するクラスのフルネã?ãƒ?
1301             *
1302             * @return      オブジェクãƒ?
1303             * @throws RuntimeException 何らかã?エラーが発生したå?å�?
1304             */
1305            public static Object newInstance( final String cls ) {
1306                    return newInstance( cls,Thread.currentThread().getContextClassLoader() );
1307            }
1308    
1309            /**
1310             * æŒ?®šされたクラスローãƒ?‚’使って、識別id に応じã�?オブジェクトを作æ?しますã?
1311             * 作æ?するには、デフォルトコンストラクターがå¿?¦�ですã?
1312             * initialize パラメータは true 相å½?それまでに初期化されてã�?�ªã�??合だけå?期化)ですã?
1313             *
1314             * @param       cls             作æ?するクラスのフルネã?ãƒ?
1315             * @param       loader  作æ?するクラスのクラスローãƒ?
1316             *
1317             * @return      オブジェクãƒ?
1318             * @throws RuntimeException 何らかã?エラーが発生したå?å�?
1319             */
1320            public static Object newInstance( final String cls,final ClassLoader loader ) {
1321                    try {
1322                            return Class.forName( cls,true,loader ).newInstance();
1323                    }
1324                    catch( ClassNotFoundException ex1 ) {
1325                            String errMsg = "クラスが見つかりません。class=[" + cls + "]" + CR
1326                                                    + ex1.getMessage() ;
1327                            throw new RuntimeException( errMsg,ex1 );
1328                    }
1329                    catch( LinkageError ex2 ) {
1330                            String errMsg = "リンケージが失敗しました。class=[" + cls + "]" + CR
1331                                                    + ex2.getMessage();
1332                            throw new RuntimeException( errMsg,ex2 );
1333                    }
1334                    catch( InstantiationException ex3 ) {
1335                            String errMsg = "インスタンスの生æ?が失敗しました。class=[" + cls + "]" + CR
1336                                                    + ex3.getMessage() ;
1337                            throw new RuntimeException( errMsg,ex3 );
1338                    }
1339                    catch( IllegalAccessException ex4 ) {
1340                            String errMsg = "クラスまたã?初期化子にアクセスできません。class=[" + cls + "]" + CR
1341                                                    + ex4.getMessage();
1342                            throw new RuntimeException( errMsg,ex4 );
1343                    }
1344                    catch( RuntimeException ex5 ) {         // 3.6.0.0 (2004/09/17)
1345                            String errMsg = "予期せぬエラー class=[" + cls + "]" + CR
1346                                                    + ex5.getMessage() ;
1347                            throw new RuntimeException( errMsg,ex5 );
1348                    }
1349            }
1350    
1351            /**
1352             * æŒ?®šã?URLæ–?­—å?同士をé?結させますã?
1353             * そã?ときã?後方URLがã?絶対パスの場合ã?ã€??結せã�?後方URLを返しますã?
1354             * 第?’引数以降ã?、絶対パス判定をせず直前ã?URLの末尾判定ã?みで連結しますã?
1355             *
1356             * 絶対パスかどã�?�‹はã€??常のファイル属æ?と同様に、å?頭がã?'/' (UNIX)またã?ã€?
1357             * ?’文字目がã?":" (Windows)の場合ã?またã?、å?頭ã�?"\" (ネットワークパス)で
1358             * 始まるå?合で判断しますã?
1359             * 連結時に、前方URLの末尾に "/" を付加しますã?
1360             *
1361             * 処ç�??互換性確保ã?ため、第?“引数の可変長引数を追åŠ?�—てã�?�¾すã?
1362             *
1363             * @og.rev  5.0.0.1 (2009/08/15) 不要なオブジェクトã?生æ?を抑制するã€?
1364             * @og.rev  5.6.5.2 (2013/06/21) 第?“引数を可変長引数に変更
1365             *
1366             * @param       url1 先é?URLæ–?­—å?
1367             * @param       url2 後方URLæ–?­—å?(絶対パスの場合ã?、返り値)
1368             * @param       urls 後方URLæ–?­—å?
1369             *
1370             * @return      URLæ–?­—å?同士の連結結果 url1 + url2(url2が絶対パスの場合ã?、url2から連結開å§?
1371             */
1372            public static String urlAppend( final String url1,final String url2,final String... urls ) {
1373                    StringBuilder rtnUrl = new StringBuilder( 200 );
1374    
1375                    if(        url2 == null || url2.length() == 0 ) { rtnUrl.append( url1 ) ; }
1376                    else if( ( url1 == null || url1.length() == 0 ) ||
1377                                     ( url2.charAt(0) == '/'  ) ||                                                  // 実ディレクトリã�?UNIX
1378                                     ( url2.length() > 1 && url2.charAt(1) == ':' ) ||           // 実ディレクトリã�?Windows
1379                                     ( url2.charAt(0) == '\\' )     ) {                                                     // 実ディレクトリã�?ネットワークパス
1380                                            rtnUrl.append( url2 ) ;
1381                    }
1382                    else {
1383                            char ch = url1.charAt( url1.length()-1 ) ;
1384                            if( ch == '/' || ch == '\\' ) {
1385                                    rtnUrl.append( url1 ).append( url2 ) ;
1386                            }
1387                            else {
1388                                    rtnUrl.append( url1 ).append( "/" ).append( url2 ) ;
1389                            }
1390                    }
1391    
1392                    // ここからがã?追åŠ??
1393                    for( String url : urls ) {
1394                            if( url != null && url.length() > 0 ) {
1395                                    char ch = rtnUrl.charAt( rtnUrl.length()-1 ) ;
1396                                    if( ch == '/' || ch == '\\' ) {
1397                                            rtnUrl.append( url ) ;
1398                                    }
1399                                    else {
1400                                            rtnUrl.append( "/" ).append( url ) ;
1401                                    }
1402                            }
1403                    }
1404    
1405                    return rtnUrl.toString() ;
1406            }
1407    
1408            /**
1409             * Unicodeæ–?­—å?の値ã‚?HTML のエスケープ記号(&amp;#xZZZZ;)に変換しますã?
1410             *
1411             * SJIS(JA16SJIS) で作æ?されたデータベã?スにã€?NVARCHAR2)を使用して中国語等を登録するのは
1412             * 非常にè¤?›‘でかつ、リスクが大きい処ç�?�«なりますã?
1413             * ORACLE殿でもã?自信を持っては勧められなã�?©Ÿè?とのコメントを頂いてã�?�¾すã?
1414             * そこで、HTMLでのエスケープ文字を使用して、Unicodeを文字å?化して登録する為の
1415             * DBType として、新規に作æ?しますã?
1416             * ここでは、å?力文字を、キャラクタ(char)型にåˆ?§£しã?(&amp;#xZZZZ;)に変換してã�?��ますã?
1417             * よってã€??常に?‘文å­?Shift-JISで?’Byte,UTF-8で?“Byte)がã??˜Byteになりますã?
1418             * こã?変換された文字å?をã?HTML上でそã?まま取り出すと、å?のUnicodeæ–?­—に戻る為ã€?
1419             * 通常のShift-JISでは、扱えなã�?–‡å­?中国語など)でも表示可能になりますã?
1420             * ここではã€?バイト文字ã?み、変換してã�?�¾すã?
1421             *
1422             * @param       value 変換前ã?æ–?­—å?
1423             *
1424             * @return      HTMLのエスケープ記号(&amp;#xZZZZ;)
1425             */
1426            public static String getUnicodeEscape( final String value ) {
1427                    if( value == null || value.length() == 0 ) { return ""; }
1428    
1429                    StringBuilder rtn = new StringBuilder( value.length() * 4 );
1430    
1431                    for( int i=0; i<value.length(); i++ ) {
1432                            char ch = value.charAt(i);
1433    
1434                            if( ch > 0xff ) {
1435                                    String hex = Integer.toHexString( (int)ch ) ;
1436                                    rtn.append( UTF_STR[hex.length()] ).append( hex ).append( ";" );
1437                            }
1438                            else {
1439                                    rtn.append( ch );
1440                            }
1441                    }
1442    
1443                    return rtn.toString();
1444            }
1445    
1446            /**
1447             * HTML のエスケープ記号(&amp;#xZZZZ;)をUnicodeæ–?­—å?に戻しますã?
1448             *
1449             * HTMLでのエスケープ文字を使用して登録された文字を、Unicodeに戻しますã?
1450             * (&amp;#xZZZZ;)の?˜Byteをã?もとのキャラクタコードに戻しã?合æ?しますã?
1451             * ここではã€??常のæ–?­—å?に混在したエスケープ文字も戻せるようにしますã?
1452             *
1453             * @param       value   HTMLのエスケープ記号(&amp;#xZZZZ;)を含ã‚?–‡字å?
1454             *
1455             * @return      通常のUnicodeæ–?­—å?
1456             */
1457            public static String getReplaceEscape( final String value ) {
1458                    if( value == null || value.length() == 0 ) { return ""; }
1459    
1460                    StringBuilder rtn = new StringBuilder( value );
1461    
1462                    int st = rtn.indexOf( "&#" );
1463                    while( st >= 0 ) {
1464                            if( st+7 < rtn.length() && rtn.charAt( st+7 ) == ';' ) {
1465                                    int ch = Integer.parseInt( rtn.substring( st+3,st+7 ),16 );
1466                                    rtn.replace( st,st+8, Character.toString( (char)ch ) );
1467                            }
1468                            st = rtn.indexOf( "&#",st );
1469                    }
1470    
1471                    return rtn.toString();
1472            }
1473    
1474            /**
1475             * æ–?­—å?をdoubleに変換しますã?
1476             *
1477             * これは、Double.parseDouble( value ) と、ほぼ同じ動作を行いますã?
1478             * å†?ƒ¨çš?�«は、引数の カンãƒ?,) を削除したæ–?­—å?をã?Double.parseDouble( value )
1479             * に渡しますã?
1480             * またã?引数がã?null,ゼロæ–?­—å?,'_' の時にはã€?.0 を返しますã?
1481             *
1482             * @param       value   doubleに変換するå…??æ–?­—å?
1483             *
1484             * @return      変換後ã?double数値
1485             */
1486            public static double parseDouble( final String value ) {
1487                    double rtn ;
1488    
1489                    if( value == null || value.length() == 0 || value.equals( "_" ) ) {
1490                            rtn = 0.0d;
1491                    }
1492                    else if( value.indexOf( ',' ) < 0 ) {
1493                            rtn = Double.parseDouble( value );
1494                    }
1495                    else {
1496                            char[] chs = value.toCharArray() ;
1497                            int j=0;
1498                            for( int i=0;i<chs.length; i++ ) {
1499                                    if( chs[i] == ',' ) { continue; }
1500                                    chs[j] = chs[i];
1501                                    j++;
1502                            }
1503                            rtn = Double.parseDouble( String.valueOf( chs,0,j ) );
1504                    }
1505    
1506                    return rtn ;
1507            }
1508    
1509            /**
1510             * カラーキーワードよりã?Colorオブジェクトを作æ?しますã?
1511             *
1512             * æŒ?®š文字å?は、java.awt.Color クラスのstatic フィールド名でæŒ?®šしますã?
1513             * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
1514             * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , PURPLE , TRANSPARENT(透æ?) が指定できますã?
1515             * またã?先é?にã€? を付ける事でã€?XXXXXX形式ã?16bitRGB表è¨?でも指定可能ですã?
1516             * static フィールド名のMapを管ç�?�—てã�?�¾すが、存在しなã�??合ã?、エラーになりますã?
1517             *
1518             * @og.rev 3.8.9.1 (2007/06/29) 新規作æ?
1519             * @og.rev 4.1.1.0 (2008/02/04) CLR_MAP に存在しなã�??合ã?エラーにしますã?
1520             *
1521             * @param       value java.awt.Color フィールドを示す文字å?またã?ã€?XXXXXX形式ã?16bitRGB表è¨?
1522             *
1523             * @return      Colorオブジェクãƒ?
1524             * @see         java.awt.Color#BLACK
1525             */
1526            public static Color getColorInstance( final String value ) {
1527                    final Color clr ;
1528    
1529                    if( value.startsWith("#") ) {
1530                            int code = Integer.parseInt( value.substring(1),16 );
1531                            clr = new Color( code );
1532                    }
1533                    else {
1534                            clr = CLR_MAP.get( value );
1535                            if( clr == null ) {
1536                                    String errMsg = "æŒ?®šã?色コードã?使用できません Color=[" + value + "]" + CR
1537                                                            + "ColorMap=" + CLR_MAP.keySet().toString();
1538                                    throw new RuntimeException( errMsg );
1539                            }
1540                    }
1541    
1542                    return clr;
1543            }
1544    
1545            /**
1546             * 引数からspanタグを取り除ã�?�¦返しますã?
1547             *
1548             * 引数がã?&lt;span ?¥?¥?¥&gt;XXXX&lt;/span&gt;形式ã?場合ã?XXXX のみ出力しますã?
1549             *
1550             * @og.rev 4.3.4.3 (2008/12/22) TableWriterで利用してã�?�Ÿもã?を移å‹?
1551             *
1552             * @param        data å…??Stringæ–?­—å?
1553             *
1554             * @return       spanタグが取り除かれた文字å?
1555             */
1556            public static String spanCut( final String data ) {
1557                    String rtn = data;
1558                    if( data != null && data.startsWith( "<span" ) ) {
1559                            int st = data.indexOf( '>' );
1560                            int ed = data.indexOf( "</span>",st );
1561                            rtn = data.substring( st+1,ed );
1562                    }
1563                    return rtn ;
1564            }
1565    
1566            /**
1567             * 簡易CSS形式ã?フォーマットを、Mapにセãƒ?ƒˆしますã?
1568             *
1569             * 簡易CSS形式とは、セレクタのなã�??{ プロパティ1 : 値1 ; ・・・ } 形式としますã?
1570             * これをã?プロパティ1 と 値1 のMap にセãƒ?ƒˆする処ç�?‚’行いますã?
1571             * コメントã?、削除されますã?またã?同ä¸??ロパティが記述されてã�?‚‹場合ã?、後å?ç�?‚’採用しますã?
1572             *
1573             * なおã?入力テキストが、null かã?{…} が存在しなã�??合ã?、null を返しますã?
1574             *
1575             * @og.rev 5.6.5.2 (2013/06/21) 新規追åŠ?
1576             *
1577             * @param        cssText 簡易CSS形式ã?フォーマット文字å?
1578             *
1579             * @return       パã?ス結果のMap
1580             */
1581            public static Map<String,String> cssParse( final String cssText ) {
1582                    Map<String,String> map = null;
1583    
1584                    if( cssText != null ) {
1585                            // まずコメントを削除しますã?
1586                            StringBuilder buf = new StringBuilder( cssText );
1587    
1588                            int ad1 = buf.indexOf( "/*" );
1589                            while( ad1 >= 0 ) {
1590                                    int ad2 = buf.indexOf( "*/" , ad1 );
1591                                    if( ad2 < 0 ) { buf = buf.delete( ad1,buf.length() ); break; }               // 閉じてなければ以降を全削除
1592                                    buf = buf.delete( ad1,ad2+2 );
1593                                    ad1 = buf.indexOf( "/*" );              // コメントã?削除されたã?で、å?めから検索するã€?
1594                            }
1595    
1596                            // 処ç�?¯¾象は、{ ??} の間ã?æ–?­—å?ã€?
1597                            ad1 = buf.indexOf( "{" );
1598                            int ad2 = buf.indexOf( "}",ad1 );
1599                            if( ad1 >= 0 && ad2 > 0 ) {
1600                                    String tempText = buf.substring( ad1+1,ad2 );           // これがå?ç�?¯¾象のæ–?­—å?
1601    
1602                                    String[] recode = tempText.split( ";" );                        // KEY1 : VAL1; の ; でåˆ?‰²するã€?
1603    
1604                                    for( int i=0; i<recode.length; i++ ) {
1605                                            int ad = recode[i].indexOf( ':' );
1606                                            if( ad > 0 ) {
1607                                                    String key = recode[i].substring( 0,ad ).trim();
1608                                                    String val = recode[i].substring( ad+1 ).trim();
1609                                                    if( key.isEmpty() || val.isEmpty() ) { continue; }
1610    
1611                                                    if( map == null ) { map = new HashMap<String,String>(); } // 対象ãƒ??タがある時ã�?�‘Mapを作りたかったã?でã€?
1612                                                    map.put( key,val );
1613                                            }
1614                                    }
1615                            }
1616                    }
1617                    return map ;
1618            }
1619            
1620            /**
1621             * 引数から空白æ–?­—を削除して返しますã?
1622             *
1623             *
1624             * @og.rev 5.6.9.4 (2013/10/31) TableWriterで利用してã�?�Ÿもã?を移å‹?
1625             *
1626             * @param        data å…??Stringæ–?­—å?
1627             *
1628             * @return       空白æ–?­—が取り除かれた文字å?
1629             */
1630            public static String deleteWhitespace( final String data ) {
1631                    if( data == null || data.length() == 0 ){
1632                            return data;
1633                    }
1634                    return data.replaceAll( "\\s", "" ) ;
1635            }
1636    }