1

これは、このフォーラムでの最初の質問です。質問が初心者である場合は、アドバイスをお願いします。

を介してユーザー入力を受け取るため、EditText文字列/文字列です。次に、BigDecimalその値を保持するために作成しました。指数も問題なく優雅に処理します。しかし問題は、ユーザーが1.1E+(末尾の指数値なしで)次のような値を入力すると、このコードでコードがクラッシュすることです。しかし、入力がこのような場合に機能します1.1E+2

EditText edit_text_left;
Editable editable_val_text;
....
editable_val_text = edit_text_left.getText();
BigDecimal val = new BigDecimal((editable_val_text.toString().trim())); // crash happens here

これをどのように処理しますか?

詳細: Google 単位変換アプリで、デジタル ストレージを選択して、ペタバイトからビットへの変換を試すことができます。ペタバイト単位で 9 と入力すると8.106e+16、ビット セクションに表示されます。に編集8.106e+16してみてください8.106e+。それでも機能します。私は同様の取り扱いだけが欲しいです。

4

3 に答える 3

2

IMO、あなたがすべきことは、(それを囲むtry-catchステートメントで)例外をキャッチし、無効な番号を提供したことをユーザーに伝えることです。

非標準バージョンの「科学的」形式を処理したい場合は、おそらく独自の数値パーサー/コンバーターを実装する必要があります。これを行うには、BigDecimal クラスから標準の解析コードを取得し、それを非標準形式を理解する静的ヘルパー メソッドに変換します。

または、非標準形式の文字列に一致する正規表現を作成し、それを使用して、文字列を に受け入れられる形式に修正することもできますBigDecimal

しかし、率直に言って、私はそれをしません。ユーザーが科学的な形式を理解できる場合は、構文を正しく理解することもできるはずです...

于 2013-01-02T09:03:21.983 に答える
0

このコミュニティと返信してくれたすべての人に感謝します。ヒントの1つは、問題を解決するためのアイデアを私に与えました。その終わりのe/E / e- / E- / e + /E+を処理するための組み込みのメソッドはありません。むしろ、String.endsWithメソッドを使用して、孤独なe / E / e- / E- / e + / E +を識別し、それらを文字列から削除しました。

if ((str.endsWith("e")) || (str.endsWith("E")))    {
    str1 = str.copyValueOf(str.toCharArray(), 0, str.length() - 1);
}
else if ((str.endsWith("e+")) || (str.endsWith("E+")) || (str.endsWith("e-")) || (str.endsWith("E-")))    {
    str1 = str.copyValueOf(str.toCharArray(), 0, str.length() - 2);
}
于 2013-01-03T03:40:40.220 に答える
0

BigDecimalの Javadoc によると

指数は、文字 'e' ('\u0075') または 'E' ('\u0045') とそれに続く 1 つ以上の 10 進数で構成されます。-Integer.MAX_VALUE (Integer.MIN_VALUE+1)指数の値は ~ の間になければなりませんInteger.MAX_VALUE

私見あなたができることは、最後に入力された指数を記憶し、例外が発生した場合、その種の動作が必要な場合は最後の指数を追加することです。

于 2013-01-02T09:07:41.780 に答える