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 */ 016package org.opengion.plugin.column; 017 018import java.math.BigDecimal; 019import java.text.NumberFormat; 020 021import org.opengion.fukurou.model.NativeType; 022import org.opengion.fukurou.util.ErrorMessage; 023import org.opengion.fukurou.util.StringUtil; 024import org.opengion.hayabusa.db.AbstractDBType; 025import org.opengion.hayabusa.db.DBTypeCheckUtil; 026 027/** 028 * 半角小数付き数字の NUMBER を扱う為の、カラム属性を定義します。 029 * 030 * '0' ~ '9' ,'-' ,'.'でのみ構成されている数字型カラム属性を定義します。 031 * さらに、カンマ','が含まれていても OK とします。ただし、データからは取り除きます。 032 * 033 * タイプチェックとして、以下の条件を判定します。 034 * ・0~9、マイナス(-)および小数点(.)を許可 035 * ・整数部の長さチェック 036 * ・小数部の長さチェック 037 * ・小数点の位置チェック 038 * ・符号の位置チェック 039 * ・文字パラメータの 正規表現チェック 040 * 041 * @og.group データ属性 042 * 043 * @version 4.0 044 * @author Kazuhiko Hasegawa 045 * @since JDK5.0, 046 */ 047public class DBType_R extends AbstractDBType { 048 /** このプログラムのVERSION文字列を設定します。 {@value} */ 049 private static final String VERSION = "5.6.0.3 (2012/01/24)" ; 050 051 private static final String DEF_VALUE = "0.00" ; // データのデフォルト値 052 053 /** 054 * デフォルトコンストラクター 055 * 056 * @og.rev 4.0.0.0 (2005/01/31) type 廃止 057 */ 058 public DBType_R() { 059 super( DEF_VALUE ); 060 } 061 062 /** 063 * NATIVEの型の識別コードを返します。 064 * 065 * @og.rev 3.5.4.7 (2004/02/06) 新規作成 066 * @og.rev 4.1.1.2 (2008/02/28) Enum型(fukurou.model.NativeType)に変更 067 * 068 * @return NATIVEの型の識別コード(DBType で規定) 069 * @see org.opengion.fukurou.model.NativeType 070 */ 071 @Override 072 public NativeType getNativeType() { 073 return NativeType.DOUBLE; 074 } 075 076 /** 077 * 半角0文字の固定長でFILL埋めされた文字列を返します。 078 * なお、エラーチェックは行われません。 079 * 実行前に、必ず valueCheck( String value ,int len ) が行われる必要があります。 080 * 081 * @og.rev 3.5.4.5 (2004/01/23) エンコード指定に変更します。 082 * 083 * @param value FILL埋めする文字列 084 * @param sizeX 整数部分の文字列の長さ 085 * @param sizeY 小数部分の文字列の長さ 086 * @param encode 固定長で変換する文字エンコード 087 * 088 * @return FILL埋めした新しい文字列 089 * @og.rtnNotNull 090 */ 091 @Override 092 public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) { 093 094 final NumberFormat format = NumberFormat.getInstance(); 095 format.setMinimumIntegerDigits( sizeX ); 096 format.setMinimumFractionDigits( sizeY ); 097 098 final double dd = StringUtil.parseDouble( value ); 099 return format.format( dd ); // 6.1.1.0 (2015/01/17) refactoring 100 } 101 102 /** 103 * String引数の文字列を+1した文字列を返します。 104 * これは、英字の場合(A,B,C など)は、B,C,D のように,最終桁の文字コードを 105 * +1 します。 106 * 文字列が数字タイプの場合は, 数字に変換して、+1 します。(桁上がりもあり) 107 * 混在タイプの場合は,最後の桁だけを確認して +1します。 108 * 引数が null の場合と、ゼロ文字列("")の場合は,物理的初期設定値(String getDefault()) 109 * の値を返します。 110 * 111 * @og.rev 3.3.0.0 (2003/06/23) 値を+1していた箇所を、Double から、BigDecimal に変更。 112 * 113 * @param value String引数の文字列 114 * 115 * @return String引数の文字列を+1した文字列 116 */ 117 @Override 118 public String valueAdd( final String value ) { 119 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 120 return value == null || value.isEmpty() ? getDefault() : new BigDecimal( value ).add( BigDecimal.ONE ).toString(); 121 122 } 123 124 /** 125 * String引数の文字列に、第2引数に指定の文字列(数字、日付等)を加算して返します。 126 * 127 * ここでは、小数文字列に、別の数字(小数も可)文字列を加算します。 128 * 内部処理に、BigDecimal を使用しています。 129 * 130 * @og.rev 5.6.0.3 (2012/01/24) ADD に、引数の値を加算する機能を追加します。 131 * 132 * @param value String引数 133 * @param add 加算する数字文字列 134 * 135 * @return 引数の文字列に数字を加算します。 136 */ 137 @Override 138 public String valueAdd( final String value,final String add ) { 139 if( value == null || value.isEmpty() ) { return getDefault(); } 140 141 BigDecimal addSu = BigDecimal.ONE; 142 if( add != null && !add.isEmpty() ) { 143 addSu = new BigDecimal( add ); 144 } 145 146 final BigDecimal val = new BigDecimal( value ).add( addSu ); 147 return val.toString(); 148 } 149 150 /** 151 * エディターで編集されたデータを登録する場合に、データそのものを 152 * 変換して、実登録データを作成します。 153 * 例えば,大文字のみのフィールドなら、大文字化します。 154 * 実登録データの作成は、DBType オブジェクトを利用しますので, 155 * これと Editor とがアンマッチの場合は、うまくデータ変換 156 * されない可能性がありますので、注意願います。 157 * 158 * @og.rev 3.3.3.0 (2003/07/09) 前後のスペースを取り除いておく。 159 * @og.rev 3.3.3.1 (2003/07/18) 後ろスペースを取り除く。(StringUtil#rTrim) 160 * 161 * @param value (一般に編集データとして登録されたデータ) 162 * 163 * @return 修正後の文字列(一般にデータベースに登録するデータ) 164 */ 165 @Override 166 public String valueSet( final String value ) { 167 return StringUtil.deleteChar( StringUtil.rTrim( value ),',' ); 168 } 169 170 /** 171 * データが登録可能かどうかをチェックします。 172 * データがエラーの場合は、そのエラー内容を返します。 173 * 174 * @og.rev 2.1.1.2 (2002/11/21) マイナス記号を含む場合の最大桁数の設定を考慮する。 175 * @og.rev 2.3.1.4 (2003/02/18) 属性チェックを強化した。 176 * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータ(文字パラメータ)を引数に追加 177 * @og.rev 5.2.2.0 (2010/11/01) 厳密にチェック(isStrict=true)するフラグを追加 178 * 179 * @param key キー 180 * @param value 値 181 * @param sizeX 整数部分の文字列の長さ 182 * @param sizeY 小数部分の文字列の長さ 183 * @param typeParam dbType パラメータ(文字パラメータ) 184 * @param isStrict 厳密にチェックするかどうか[true:する/false:標準的] 185 * 186 * @return エラー内容 187 * @og.rtnNotNull 188 */ 189 @Override 190 public ErrorMessage valueCheck( final String key ,final String value , 191 final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) { 192 193 final ErrorMessage msg = new ErrorMessage(); 194 if( value == null || value.isEmpty() ) { return msg; } 195 196 String check; 197 198 check = DBTypeCheckUtil.decimalFormatCheck( value ); 199 if( check != null ) { 200 // 指定の文字以外の文字が使われています。 201 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check ); 202 } 203 204 check = DBTypeCheckUtil.sizeXCheck( value ,sizeX ,sizeY ); 205 if( check != null ) { 206 // 整数部の長さが指定の長さよりも長いです。 207 msg.addMessage( 0, ErrorMessage.NG, "ERR0021", key, value, check, String.valueOf( sizeX ) ); 208 } 209 210 check = DBTypeCheckUtil.sizeYCheck( value ,sizeX ,sizeY ); 211 if( check != null ) { 212 // 小数部の長さが指定の長さよりも長いです。 213 msg.addMessage( 0,ErrorMessage.NG,"ERR0022", key, value, check, String.valueOf( sizeY ) ); 214 } 215 216 check = DBTypeCheckUtil.decimalPointCheck( value ); 217 if( check != null ) { 218 // 小数点の位置が不正です。 219 msg.addMessage( 0, ErrorMessage.NG, "ERR0024", key, check ); 220 } 221 222 check = DBTypeCheckUtil.decimalCodeCheck( value ); 223 if( check != null ) { 224 // 符号の位置が不正です。 225 msg.addMessage( 0, ErrorMessage.NG, "ERR0023", key, check ); 226 } 227 228 // 3.6.0.0 (2004/09/22) dbType パラメータ(文字パラメータ)を使用したマッチチェック 229 check = DBTypeCheckUtil.matcheCheck( value,typeParam ); 230 if( check != null ) { 231 // 指定の文字以外の文字が使われています。 232 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check ); 233 } 234 235 return msg; 236 } 237}