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