UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】数字の文字列のはずがBigDecimalへの型変換でNumberFormatExceptionになる

あるAPIのレスポンスの結果で、長さの単位のフィートの項目がある

このフィートの値は文字列でセットされているので、のちのち計算するためBigDecimalに型変換したい

すごく単純に、以下のように型変換するだけでよいと思ったがNumberFormatExceptionが発生した

BigDecimal feet = new BigDecimal(strFeet);

仕様では数字以外の文字列はこないことになっているはずで、ログに出力してみても数字にみえる

log.error("square feet : {}", strFeet);
2020-0X-XX XX:XX:XX.XXX ERROR 1 --- c.s.c.e.port.EntityConverter : square feet : 1292 

うしろに空白か?と思って出力したログを確認したが空白はなかったので頭を抱えてしまった

ログをバイト配列で出力する

ここで、バイト配列で出力しないと正確にはわからないというアドバイスをもらい

確かにと思いながらログ出力の実装を修正

log.error("square feet bytes: {}", Arrays.toString(squareFeet.getBytes()));
2020-0X-XX XX:XX:XX.XXX ERROR 1 --- c.s.c.e.port.EntityConverter : square feet : [49, 50, 57, 50, 32]
2020-0X-XX XX:XX:XX.XXX ERROR 1 --- c.s.c.e.port.EntityConverter : square feet : [50, 50, 52, 52, 32]
2020-0X-XX XX:XX:XX.XXX ERROR 1 --- c.s.c.e.port.EntityConverter : square feet : [78, 97, 78]

文字列に戻すとそれぞれ

 [49, 50, 57, 50, 32] → "1292 "
 [50, 50, 52, 52, 32] → "2244 "
 [78, 97, 78] → "NaN"

原因は末尾の空白だった(あと、NaNも紛れこんでいた)

Stringで出力するとログではおそらくトリムされていた?っぽいので気づけなかったが、正確な文字列を確認する場合はバイト配列で出力するべきだということを学んだ