質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2317閲覧

JSPで小数値の表示について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

2クリップ

投稿2018/04/04 07:21

小数以下8桁までの小数をJSPで扱いたいのですが、想定した結果となりません。
テキストボックスに「0.00000001」と表示させたいのですが「1E-8」と表示されてしまいます。
JSPに「0.00000001」とべた書きした場合は正常に表示されます。
どのように対応したらよいでしょうか?

html

1<form:input path="aaa" type="number" value="${aaaa}" />

Java

1public String list(Model model) { 2 final private BigDecimal aaa = new BigDecimal("0.00000001"); 3 Form form = new Form(); 4 form.setAaa(aaa); 5 model.addAttribute("form", form); 6 7 return "パス"; 8}
defghi1977👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

form.setAaaメソッドに渡したBigDecimalインスタンスのtoStringメソッドが暗黙的に呼び出されているのでしょう.
1e-8は数値0.00000001の浮動小数点形式での記法で, 結局は同じ値を表していますからinput要素にtype="number"を指定していることから実用上の問題は発生しないと思われます.

とは言え, これが看過できないのであれば, 事前にBigDecimalの値を目的の形式の文字列(BigDecimal.toPlainStringを使う?)としてからform.setAaaに渡せばよいでしょう.

NOTE:
なおその方法については別途お調べ下さい.(回答者はほとんどJavaを忘れています)


追記

この後いろいろと調べてみた結果, Choromeでは小数点下の桁数が6桁を超える(つまり7桁以上)input[type="number"]要素の表示内容が強制的に浮動小数点形式になってしまうようです.

従ってJSP側で0.00000001と出力しようが結局WEBブラウザ側で1e-8形式に変換してしまうため, クライアントサイドでのスクリプトで対処する他ありません.

そこで次のような回避スクリプトを作ってみました.
(とは言え、問題が完全に解決するわけではありません)

JavaScript

1//※事前に読み込んでおく 2//input[type="number"]要素の表記を修正する 3function fixNum(input){ 4 const value = input.valueAsNumber; 5 const numstr = value.toFixed(16); 6 if(numstr.match(/./) && value != 0){ 7 input.value = numstr.replace(/0+$/, ""); 8 console.log(value == input.valueAsNumber);//値に変化がないことを確認 9 } 10}

HTML

1<!--問題を引き起こしているinput(form:input)要素の直後に下記のようなscript要素を記述しておく--> 2<input type="number" value="1e-7" autocomplete="off" step="1e-7"/> 3<script> 4{ 5 const input = document.currentScript.previousElementSibling; 6 input.addEventListener("change", e => fixNum(input)); 7 fixNum(input); 8} 9</script>

投稿2018/04/04 07:52

編集2018/04/04 11:35
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/04 08:19

toPlainStringでいけることはわかりました。ありがとうございます jspで${aaaa}に対してtoPlainStringするやり方があれば教えて下さい。
defghi1977

2018/04/04 08:35

form.setAaa(aaa.toPlainString()); じゃないの?
退会済みユーザー

退会済みユーザー

2018/04/04 08:37

JavaじゃなくてJSPでやりたいんです
defghi1977

2018/04/04 08:42

「JSPでやりたい」というのは「Java側のコードを変更できないので」「JSP側のコードの編集のみでしのぎたい」ということですか?
defghi1977

2018/04/04 08:49

JSPというかSpring MVCっぽいな・・・
退会済みユーザー

退会済みユーザー

2018/04/04 08:54

Spring MVCですね c:setでaaaをセットしてやればいいんですかね、、、
退会済みユーザー

退会済みユーザー

2018/04/04 08:55

「JSPでやりたい」というのは「Java側のコードを変更できないので」「JSP側のコードの編集のみでしのぎたい」ということです
defghi1977

2018/04/04 09:05

予め断っておくと, Java周りは詳しくないのでこれ以上力になれないかもしれない. --- で, <form:input type="number">のレンダリング結果のHTMLが<input type="number">となっているのであれば, value属性の値が「1e-8」でも良いはず. →と思うたら, Chormeで動かんのかー
退会済みユーザー

退会済みユーザー

2018/04/04 09:06

ありがとうございます 「1e-8」ではよろしくないんですよね、、、
defghi1977

2018/04/04 09:14

取り急ぎタグに「JSP」「Spring MVC」「HTML」を追加してより詳しい方の見解を仰いだほうが良さそう. どうも、フレームワークの内部動作が判らんことには. 後は, JavaScript側からのアプローチも考えられないこともないのですが, 下策な気がします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問