今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

new BigDecimal(String)について調べてみた

業務システムでは必須とも言うべきBigDecimalクラス。

今回は、Integer.parseInt(String)Double.parseDouble(String)に続いてnew BidDecimal(String)を調べてみた。

 

整数だけでなく、当然小数もparseできる。

new BigDecimal(".1")
new BigDecimal("1. ")

もOKだ。

 

Javadocを見ると、Doubleと同様に指数形式(1.2e+3みたいなやつ)にも対応しているようだ。

System.out.println(new BigDecimal("1.2e+3"));

あれ、「1200」ではなく、そのまま指数形式「1.2E+3」で表示されるなあ。

System.out.println(new BigDecimal("1200")); 

これは「1200」と表示される。

scaleを調べてみたら、前者は-2、後者は0だった。

なるほど。指数形式をparseするとscaleにも反映されるのか。

 

BigDecimalには非数とか無限大はないので、

new BigDecimal("NaN")
new BigDecimal("Infinity")

はNumberFormatExceptionになる。

"0x..."のような16進形式にも対応していない。

 

全角数字はどうだろうか?

System.out.println(new BigDecimal("1234"));

は「1234」と表示された。

BigDecimalコンストラクタのソースを見ると、ところどころCharacter.isDigit(c)とかCharacter.digit(c, 10)とかあるので、ここで文字を数値に変換しているようだ。

ということは...、やっぱりInteger.parseIntと同様に、

System.out.println(new BigDecimal("൧൨൩൪"));

も正常に「1234」と表示された。

 

ちなみに、数字以外で全角文字「.」「+」「-」「e」を使うとNumberFormatExceptionになった。

 

まとめると、Integer.parseIntで通るものは全て通り、小数や指数形式にも対応している、という感じかな。

 

JDK : 8u31