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