package com.gh.mygreen.xlsmapper.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数値型に対する変換規則を指定するアノテーションです。
* <p>対応するJavaのクラスタイプは次の通り。</p>
* <ul>
* <li>byte/short/int/long/float/doubleのプリミティブ型とそのラッパークラス。</li>
* <li>{@link java.math.BigDecimal}/{@link java.math.BigInteger}</li>
* </ul>
*
*
* <h3 class="description">書き込み時の注意事項</h3>
*
* <p>テンプレートファイルのセルの書式を「標準」に設定している場合に書き込むと、
* 書式が「標準」設定の全てのセルの書式が書き換わってしまいます。
* <br>そのため、日付や数値などの書式が必要な場合は、テンプレートファイルで予め書式を設定しておくか、
* アノテーションの属性{@link #excelPattern()}で書式を指定しておいてください。
* </p>
*
* @version 1.1
* @author T.TSUCHIE
*
*/
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface XlsNumberConverter {
/**
* 数値の書式のパターン値を指定します。
* <p>{@link java.text.DecimalFormat}で指定可能な書式を指定します。</p>
* <p>読み込み時にセルの種類が数値(通貨、会計、パーセンテージ、分数、指数)ではない場合、
* 文字列として値を取得し、その値を属性{@link #javaPattern()}で指定した書式に従いパースし、Javaの数値型に変換します。
* </p>
*
* <ul>
* <li>属性{@link #javaPattern()}で書式を指定します。
* <br>Javaのクラス{@link java.text.DecimalFormat}で解釈可能な書式を指定します。
* </li>
* <li>属性{@link #locale()}で、ロケールを指定します。
* <br>言語コードのみを指定する場合、'ja'の2桁で指定します。
* <br>言語コードと国コードを指定する場合、'ja _JP'のようにアンダーバーで区切り指定します。
* </li>
* <li>属性{@link #currency()}で、通貨コード(ISO-4217コード)を指定します。
* <br>Javaのクラス {@link java.util.Currency} で解釈可能なコードを指定します。
* </li>
* <li>書式に合わない値をパースした場合、例外{@link com.gh.mygreen.xlsmapper.cellconvert.TypeBindException}が発生します。</li>
* </ul>
*
* <pre class="highlight"><code class="java">
* public class SampleRecord {
*
* {@literal @XlsColumn(columnName="給料")}
* {@literal @XlsNumberConverter(pattern="\u00A4\u00A4 #,##0.0000", locale="ja_JP", currency="USD")}
* private double salary;
*
* }
* </code></pre>
*
* @return
*/
String javaPattern() default "";
/**
* 通貨を指定します。
* <p>{@link java.util.Currency}で処理可能なコード(ISO 4217のコード)で指定します。</p>
* <p>属性{@link #javaPattern()}を設定した場合に有効になります。
* @return
*/
String currency() default "";
/**
* ロケールの指定を行います。
* <p>指定しない場合、デフォルトのロケールで処理されます。</p>
* <p>国コード、バリアントを指定したい場合は、アンダーバー '_' で区切ります。</p>
* <p>例. 'ja', 'ja_JP', 'ja_JP_JP'</p>
* <p>属性{@link #javaPattern()}を設定した場合に有効になります。</p>
*/
String locale() default "";
/**
* 有効桁数を指定します。
* <p>Excel内部とJavaの数値は、表現可能な有効桁数が異なります。
* <br>のため、特に読み込み時などExcelの仕様に合わせてJavaのクラスに指定することが可能です。
* </p>
* <p>Excelの場合、有効桁数は15桁であるため、デフォルト値は15です。</p>
* <p>0以下の値を設定すると、桁数の指定を省略したことになります。</p>
* <p>Excelでは有効桁数が15桁であるため、Javaのlong型など15桁を超える表現が可能な数値を書き込んだ場合、
* 数値が丸められるため注意してください。
* </p>
* <ul>
* <li>例えば、long型の19桁の数値 {@code 1234567890123456789} を書き込んだ場合、
* 16桁以降の値が丸められ {@code 1234567890123450000} として書き込まれます。
* <li>Excelの仕様については、
* <a href="https://support.office.com/ja-jp/article/Excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A8%E5%88%B6%E9%99%90-1672b34d-7043-467e-8e27-269d656771c3?ui=ja-JP&rs=ja-JP&ad=JP" target="_blank">Excel の仕様と制限</a>
* を参照してください。
* </ul>
*
* @since 0.5
* @return
*/
int precision() default 15;
/**
* Excelの書式のパターン。
* <p>書き込み時に、セルの書式を直接設定したい場合に指定します。</p>
* <p>値を指定しない場合、テンプレートファイルに設定してある書式が適用されます。</p>
*
* <ul>
* <li>属性{@link #excelPattern()}で書式を指定します。
* <br>Excelの書式を指定する場合は、
* <a href="http://mygreen.github.io/excel-cellformatter/sphinx/format_basic.html" target="_blank">ユーザ定義</a>
* の形式で指定します。
* </li>
* </ul>
*
* <pre class="highlight"><code class="java">
* public class SampleRecord {
*
* {@literal @XlsColumn(name="給与")}
* {@literal @XlsDateConverter(javaPattern="[$-411]\"¥\"#,##0.0000")}
* private double salary;
*
* }
* </code></pre>
*
* @since 1.1
*/
String excelPattern() default "";
}