@CsvNumberFormat
数値型に対する書式を指定する際に利用するアノテーションです。
対応するJavaのクラスタイプは以下の通りです。
byte/short/int/long/float/double
のプリミティブ型とそのラッパークラス。java.math.BigDecimal
/java.math.BigInteger
の数値クラス。
注釈
プリミティブ型に対して読み込む際に、CSVのカラムの値が空の場合、それぞれのプリミティブ型の初期値が設定されます。
整数型の場合は 0
が、小数型の場合は 0.0
が設定されます。
初期値を変更したい場合は、アノテーション @CsvDefaultValue
[JavaDoc]を使用してください。
読み込み/書き込み時の書式を指定したい場合
属性
pattern
で書式を指定します。Javaのクラス java.text.DecimalFormat で解釈可能な書式を設定します。
属性
locale
でロケールを指定します。言語コードのみを指定する場合、'ja'の2桁で指定します。
言語コードと国コードを指定する場合、'ja _JP'のようにアンダーバーで区切り指定します。
属性
currency
で通貨コード( ISO-4217コード )を指定します。Javaのクラス
java.util.Currency
で解釈可能なコードを指定します。
書式に合わない値をパースした場合、例外
SuperCsvValidationException
が発生します。
1import com.github.mygreen.supercsv.annotation.CsvBean;
2import com.github.mygreen.supercsv.annotation.CsvColumn;
3import com.github.mygreen.supercsv.annotation.format.CsvNumberFormat;
4
5@CsvBean
6public class SampleCsv {
7
8 @CsvColumn(number=1)
9 @CsvNumberFormat(pattern="#,##0")
10 private int number;
11
12 @CsvColumn(number=2, label="給与")
13 @CsvNumberFormat(pattern="\u00A4\u00A4 #,##0.0000", locale="ja_JP", currency="USD")
14 private Double salary;
15
16 // setter/getterは省略
17}
読み込み時に曖昧に解析したい場合
曖昧なケースでも読み込めるようにしたいときは、属性 lenient
の値をtrueにします。
例えば、 12.51 と小数を整数型にマッピングする場合、13 と丸めの補正が行われます。 また、 123,456.0ab のように、途中から数値以外の文字が出現した場合、それまでの文字 123,456.0 を抽出して処理が行われます。
注釈
数値型へのパースは、本ライブラリでは java.text.DecimalFormat
を利用し、
結果を一旦 java.math.BigDecimal
で読み込み、そこからさらに、各クラスタイプに変換しています。
DecimalFormat#parse(...) は、123,456.0abc
のように、途中から数値以外の文字が出現した場合、それまでの文字を読み込み、正常処理することができます。
BigDecimal で、1234.567 という小数を読み込み、その値を BigDecimal#intValue()
で整数のint型として取得した場合、小数部分は無視されます。
int型で扱える桁数を超えたときも自動的に切り捨てられます。
1import com.github.mygreen.supercsv.annotation.CsvBean;
2import com.github.mygreen.supercsv.annotation.CsvColumn;
3import com.github.mygreen.supercsv.annotation.format.CsvNumberFormat;
4
5@CsvBean
6public class SampleCsv {
7
8 @CsvColumn(number=1)
9 @CsvNumberFormat(pattern="#,##0", lenient=true)
10 private int number;
11
12 @CsvColumn(number=2, label="給与")
13 @CsvNumberFormat(lenient=true)
14 private Double salary;
15
16 // setter/getterは省略
17}
丸めの精度と方法を指定したい場合
属性
precision
で丸めの精度を指定することができます。この属性は、属性patternを書式を指定しない場合に有効になります。
主に小数の場合に有効桁数を揃える際に利用します。 例えば、precision=4で、文字列
123.45
を double型にマッピングする場合、結果は123.4
として読み込まれます。
属性
rounding
で、丸め方の方法を指定します。値は、列挙型
java.math.RoundingMode
を設定します。デフォルトでは、
RoundingMode.HALF_EVEN
です。 詳細は、 RoundingModeのJavaDoc を参照してください。属性patternを指定した場合は、書式自身が精度を表現しており、属性roundingで丸めの方法を指定することができます。
1import com.github.mygreen.supercsv.annotation.CsvBean;
2import com.github.mygreen.supercsv.annotation.CsvColumn;
3import com.github.mygreen.supercsv.annotation.format.CsvNumberFormat;
4
5import java.math.RoundingMode;
6
7@CsvBean
8public class SampleCsv {
9
10 // 丸めの精度と方法を指定する場合
11 @CsvColumn(number=1, label="比率")
12 @CsvNumberFormat(precision=4, rounding=RoundingMode.HALF_UP)
13 private double rate;
14
15 // 書式と丸め方法を指定する場合
16 @CsvColumn(number=2, label="給与")
17 @XlsNumberFormat(pattern="#,##0", rounding=RoundingMode.CEILING, lenient=true)
18 private int salary;
19
20 // setter/getterは省略
21}
読み込み時の値のパースに失敗した際のメッセージ
読み込み時に値のパースに失敗した時に独自のメッセージとして、属性 message
で指定することができます。
メッセージ中は、JEXL による式言語を使うことができ、 予め登録されている変数を用いて、メッセージ内容を独自にカスタマイズすることができます。 詳細は、値の検証時のメッセージ を参照してください。
メッセージ中で利用可能な変数は、JavaDoc を参照してください。
1import com.github.mygreen.supercsv.annotation.CsvBean;
2import com.github.mygreen.supercsv.annotation.CsvColumn;
3import com.github.mygreen.supercsv.annotation.format.CsvNumberFormat;
4
5@CsvBean
6public class SampleCsv {
7
8 @CsvColumn(number=1, label="給料")
9 @CsvNumberFormat(pattern="", message="[{rowNumber}行, {columnNumber}列] : 項目「{label}」の値({validatedValue})は、整数の書式「{pattern}」として不正です。"
10 private int salary;
11
12 // setter/getterは省略
13}