0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BigDecimalのコンストラクタについて

Posted at

はじめに

エンジニアの長谷川と申します。
仕事上、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に変換するようなシステムの場合、システム要件に合わせて変換前にチェックをしないと、本来エラーとしたいパラメータで処理してしまいかねませんので、ご注意ください・・・。

以上、長谷川でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?