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 = { "�", "�", "�", "�", "&#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 * 例えば,リターンコードを< br />に置換えて,画面上に改行表示させるが可能ですã?
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("<"); break;
908 case '>' : rtn.append(">"); break;
909 case '"' : rtn.append("""); break;
910 case '\'' : rtn.append("'"); break;
911 case '&' : rtn.append("&"); 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("<"); break;
937 case '>' : rtn.append(">"); break;
938 case '"' : rtn.append("""); break;
939 case '\'' : rtn.append("'"); break;
940 case '&' : rtn.append("&"); 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 のエスケープ記号(&#xZZZZ;)に変換しますã?
1410 *
1411 * SJIS(JA16SJIS) で作æ?されたデータベã?スにã€?NVARCHAR2)を使用して中国語等を登録するのは
1412 * 非常にè¤?›‘でかつ、リスクが大きい処ç�?�«なりますã?
1413 * ORACLE殿でもã?自信を持っては勧められなã�?©Ÿè?とのコメントを頂いてã�?�¾すã?
1414 * そこで、HTMLでのエスケープ文字を使用して、Unicodeを文字å?化して登録する為の
1415 * DBType として、新規に作æ?しますã?
1416 * ここでは、å?力文字を、キャラクタ(char)型にåˆ?§£しã?(&#xZZZZ;)に変換してã�?��ますã?
1417 * よってã€??常に?‘文å?Shift-JISで?’Byte,UTF-8で?“Byte)がã??˜Byteになりますã?
1418 * こã?変換された文字å?をã?HTML上でそã?まま取り出すと、å?のUnicodeæ–?—に戻る為ã€?
1419 * 通常のShift-JISでは、扱えなã�?–‡å?中国語など)でも表示可能になりますã?
1420 * ここではã€?バイト文字ã?み、変換してã�?�¾すã?
1421 *
1422 * @param value 変換前ã?æ–?—å?
1423 *
1424 * @return HTMLのエスケープ記号(&#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 のエスケープ記号(&#xZZZZ;)をUnicodeæ–?—å?に戻しますã?
1448 *
1449 * HTMLでのエスケープ文字を使用して登録された文字を、Unicodeに戻しますã?
1450 * (&#xZZZZ;)の?˜Byteをã?もとのキャラクタコードに戻しã?合æ?しますã?
1451 * ここではã€??常のæ–?—å?に混在したエスケープ文字も戻せるようにしますã?
1452 *
1453 * @param value HTMLのエスケープ記号(&#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 * 引数がã?<span ?¥?¥?¥>XXXX</span>形式ã?場合ã?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 }