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.plugin.column;
017    
018    import org.opengion.hayabusa.db.AbstractRenderer;
019    import org.opengion.hayabusa.db.CellRenderer;
020    import org.opengion.hayabusa.db.DBColumn;
021    import org.opengion.fukurou.util.StringUtil;
022    
023    import java.text.DecimalFormat;
024    
025    /**
026     * DECIMAL レンãƒ?ƒ©ーは、カラãƒ??ãƒ??タをDecimal(?‘0é?数、少数)表示する場合に
027     * 使用するクラスですã?
028     * è²?•°の場合ã?spanタグclass="minus"を付けて出力しますã?
029     *
030     * 表示パラメータに与えられた文字å?は、java.text.DecimalFormat ã‚?
031     * 使用してフォーマットされますã?
032     * フォーマット変換前に、カンマなどの数値変換時にエラーになる情報を削除しておきますã?
033     *
034     * フォーマットルールは、{@link java.text.DecimalFormat} を参照願いますã?
035     * 標準ã?フォーマットã?"#,##0.#"ですã?
036     *
037     *  カラãƒ??表示にå¿?¦�な属æ?は, DBColumn オブジェクãƒ?より取り出しますã?
038     * こã?クラスは、DBColumn オブジェクト毎に?‘つ作æ?されますã?
039     *
040     * @og.rev 3.5.0.0 (2003/09/17) 新規作æ?
041     * @og.rev 5.4.3.6 (2012/01/19) コメント修正
042     * @og.group ãƒ??タ表示
043     *
044     * @version  4.0
045     * @author       Kazuhiko Hasegawa
046     * @since    JDK5.0,
047     */
048    public class Renderer_DECIMAL extends AbstractRenderer {
049            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
050            private static final String VERSION = "5.6.2.3 (2013/03/22)" ;
051    
052            private final DecimalFormat format ;
053            private final String defValue ;
054            private final String noDisplayVal ;             // 5.6.2.3 (2013/03/22)
055    
056            /**
057             * ãƒ?ƒ•ォルトコンストラクターã€?
058             * こã?コンストラクターで、基本オブジェクトを作æ?しますã?
059             *
060             * @og.rev 5.6.2.3 (2013/03/22) noDisplayVal 変数初期åŒ?
061             */
062            public Renderer_DECIMAL() {
063                    format = null;
064    //              defValue   = null;
065                    defValue   = ""; // 5.1.1.0 (2009/12/01)
066                    noDisplayVal = null;            // 5.5.1.0 (2012/04/03)
067            }
068    
069            /**
070             * 引数つきコンストラクターã€?
071             *
072             * @param       clm     DBColumnオブジェクãƒ?
073             *
074             * @og.rev 5.1.1.0 (2009/12/01) 初期値がnullの場合ã?、defValueはnullとするã€?
075             * @og.rev 5.6.2.3 (2013/03/22) noDisplayVal 変数追åŠ?
076             */
077            private Renderer_DECIMAL( final DBColumn clm ) {
078    
079                    String fm = clm.getRendererParam();
080                    if( fm == null || fm.length() == 0 || fm.equals( "_" ) ) {
081                            fm = "#,##0.#";
082                    }
083                    format = new DecimalFormat( fm );
084    
085                    // 5.1.1.0 (2009/12/01)
086                    String defv = clm.getDefault();
087                    if( defv == null || defv.length() == 0 ) {
088                            defValue = "";
089                    }
090                    else {
091                            double dd = StringUtil.parseDouble( defv );
092                            defValue = format.format( dd );
093                    }
094                    noDisplayVal = clm.getNoDisplayVal();   // 5.6.2.3 (2013/03/22)
095            }
096    
097            /**
098             * å�?‚ªブジェクトからè?åˆ??インスタンスを返しますã?
099             * 自åˆ??身をキャãƒ?‚·ュするのかã?新たに作æ?するのかã?、各サブクラスの実è£?�«
100             * まかされますã?
101             *
102             * @param       clm     DBColumnオブジェクãƒ?
103             *
104             * @return      CellRendererオブジェクãƒ?
105             */
106            public CellRenderer newInstance( final DBColumn clm ) {
107                    return new Renderer_DECIMAL( clm );
108            }
109    
110            /**
111             * ãƒ??タの表示用æ–?­—å?を返しますã?
112             *
113             * ここでは、å?ã�?0 の場合に、å?期å?を使ã�?ƒ­ジãƒ?‚¯がçµ?�¿込まれておりã€?
114             * 従来はこれを利用して、å?期å?にゼロæ–?­—å?を設定することでã€?0" ã‚?
115             * 非表示æ–?­—として扱ってã�?�¾したã€?
116             * 互換性の問題があるので、既存ã?機è?は残しますが、この処ç�??、noDisplayVal ã‚?
117             * 利用した処ç�?�«置き換えてくださいã€?
118             * 他ã?処ç�?¼?UMBER,MONEY,DBMENUなど?‰ã?、noDisplayVal を使ã�?�¾すã?
119             *
120             * @og.rev 3.8.5.2 (2006/05/31) カンマ編é›?�•れた数字ã?対å¿?
121             * @og.rev 5.3.1.0 (2009/12/01) 値ã�?の場合ã?、å?期å?を適用するã€?
122             * @og.rev 5.6.2.3 (2013/03/22) noDisplayVal 変数追åŠ?
123             *
124             * @param       value 入力å?
125             *
126             * @return      ãƒ??タの表示用æ–?­—å?
127             */
128            @Override
129            public String getValue( final String value ) {
130                    // 5.6.2.3 (2013/03/22) noDisplayVal 変数追åŠ?
131                    if( noDisplayVal != null && noDisplayVal.equalsIgnoreCase( value ) ) { return "" ; }
132    
133    //              if( value == null || (value.trim()).length() == 0 ) {
134                    if( value == null || (value.trim()).length() == 0 || "0".equals( value ) ) {
135                            return defValue;
136                    }
137    
138                    double dd = StringUtil.parseDouble( value );
139    
140                    String rtn ;
141                    synchronized( format ) {
142                            rtn = format.format( dd );
143                    }
144    
145                    if( dd < 0.0 ) {
146                            rtn = "<span class=\"minus\">" + rtn + "</span>";
147                    }
148    
149                    return rtn;
150            }
151    }