はじめに
エンジニアの長谷川と申します。
仕事上、JavaにおけるBigDecimalのコンストラクタについて初めて知ったことがありましたので
備忘として残しておきます。
取り上げるBigDecimalのコンストラクタの種類
引数の型の違いでコンストラクタがいくつか存在しますが、今回取り上げるのは
Stringを引数としたコンストラクタです。
BigDecimalに変換できるパターン
早速ですが、今回知ったBigDecimalに変換できるパターンは下記です。
"1" // 半角数字
"01" // 前0
"0.1" // 小数
"1.0" // 小数(小数部が0)
"1." // 小数点の後なし
".1" // 小数点の前なし
"1" // 全角数字
"-1" // 以降は前出の負数
"-01"
"-0.1"
"-1.0"
"-1."
"-.1"
"-1"
小数点の前後がないパターンや全角数字の場合にはてっきりNumberFormatException
が発生すると思っていたので驚きました・・・。
テストコードと結果は下記の通りです。
@DataProvider(name = "正常に変換できるパターン")
public Object[][] normal() {
return new Object[][] {
{ "1" } // 半角数字
, { "01" } // 前0
, { "0.1" } // 小数
, { "1.0" } // 小数(小数部が0)
, { "1." } // 小数点の後なし
, { ".1" } // 小数点の前なし
, { "1" } // 全角数字
, { "-1" }
, { "-01" }
, { "-0.1" }
, { "-1.0" }
, { "-1." }
, { "-.1" }
, { "-1" }
};
}
@Test(dataProvider = "正常に変換できるパターン")
public void BigDecimalのコンストラクタで変換できる(String param) {
BigDecimal actual = new BigDecimal(param);
System.out.println(actual.toPlainString());
}
[RemoteTestNG] detected TestNG version 7.4.0
1
1
0.1
1.0
1
0.1
1
-1
-1
-0.1
-1.0
-1
-0.1
-1
PASSED: BigDecimalのコンストラクタで変換できる("-01")
PASSED: BigDecimalのコンストラクタで変換できる("1.")
PASSED: BigDecimalのコンストラクタで変換できる("01")
PASSED: BigDecimalのコンストラクタで変換できる("1")
PASSED: BigDecimalのコンストラクタで変換できる("-1.0")
PASSED: BigDecimalのコンストラクタで変換できる("-.1")
PASSED: BigDecimalのコンストラクタで変換できる("-1")
PASSED: BigDecimalのコンストラクタで変換できる("-1")
PASSED: BigDecimalのコンストラクタで変換できる("0.1")
PASSED: BigDecimalのコンストラクタで変換できる(".1")
PASSED: BigDecimalのコンストラクタで変換できる("-0.1")
PASSED: BigDecimalのコンストラクタで変換できる("1")
PASSED: BigDecimalのコンストラクタで変換できる("1.0")
PASSED: BigDecimalのコンストラクタで変換できる("-1.")
===============================================
Default suite
Total tests run: 14, Passes: 14, Failures: 0, Skips: 0
===============================================
変換出来ました。
では、全角の.
や全角のー
はどうか、ということですが結果は下記の通りです。
@DataProvider(name = "正常に変換できないパターン")
public Object[][] error() {
return new Object[][] {
{ "1.0" }
, { "ー1" }
};
}
@Test(dataProvider = "正常に変換できないパターン", expectedExceptions = NumberFormatException.class)
public void BigDecimalのコンストラクタで変換できない(String param) {
BigDecimal actual = new BigDecimal(param);
System.out.println(actual.toPlainString());
}
[RemoteTestNG] detected TestNG version 7.4.0
PASSED: BigDecimalのコンストラクタで変換できない("ー1")
PASSED: BigDecimalのコンストラクタで変換できない("1.0")
===============================================
Default suite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================
expectedExceptions
で指定したNumberFormatException
が発生し変換できませんでした。
全角の数字
は変換できるのに全角の.
や全角のー
はエラーになるというちょっと釈然としない結果でした。
終わりに
BigDecimalの文字列を引数としたコンストラクタで、どんな文字列なら変換できるのかかくにしてみました。
クライアントから文字列で渡されたパラメータをBigDecimalに変換するようなシステムの場合、システム要件に合わせて変換前にチェックをしないと、本来エラーとしたいパラメータで処理してしまいかねませんので、ご注意ください・・・。
以上、長谷川でした。