8

私は国際的なプロジェクトに取り組んでおり、Java では、小数点記号の選択がロケールの国ではなく言語に基づいていることを確認しました。例えば:

DecimalFormat currencyFormatter = (DecimalFormat) NumberFormat.getInstance(new Locale("it","IT"));
System.out.println(currencyFormatter.format(-123456.78));

currencyFormatter = (DecimalFormat) NumberFormat.getInstance(new Locale("en","IT"));
System.out.println(currencyFormatter.format(-123456.78));

次の出力が生成されます。

-123.456,78
-123,456.78

私がその国にいる場合、私が英語を話すかイタリア語を話すかに関係なく、その国の数字は小数点区切り記号がカンマで書かれているため、国に続くと予想していました。

私の質問は 2 つあります。

  1. この行動が言語に従う理由を誰かが知っていますか?
  2. さらに重要なことは、代わりにJavaのデフォルトの動作を変更して言語に従う方法について、誰かが詳細を提供できますか?

ありがとう。

4

8 に答える 8

6

システムに既知の「en_IT」ロケールがなく、Javaがそのようなロケールを認識していない可能性が非常に高いです。

したがって、次のJavaDocのLocaleこのメモに従って、最も一致するロケールのリソースを取得します。

特定のロケールのリソースを要求すると、必ずしも正確に要求したものではなく、利用可能な最良の一致が返されます。詳細については、を参照してくださいResourceBundle

関連ドキュメントはResourceBundle、特定のリソースを見つけるための識別子として国だけが試みられることは決してないことを示しています。言語、言語+国、および言語+国+バリアントのみが使用されます。

于 2010-02-17T16:42:56.967 に答える
4

1.-この振る舞いが言語に従う理由を誰かが知っていますか?

アプリケーションのロケールに応じて変化する最初の側面の1つは、言語です。公用語としてフランス語とドイツ語の両方を使用しているスイスについて考えてみてください。このシナリオで国を使用することは意味がありません。通貨以外にも、考慮すべきメッセージの表示などの他の側面があるためです。

同じことが多くの国にも当てはまります(カナダは私の頭に浮かぶ他の国です)。

国はその言語を専門にするオプションです。

「イタリア語英語」がないので、en_ITはあまり意味がありません。したがって、「英語」が必要です。そのため、返されるインスタンスは「en」英語のインスタンスです。

2.-さらに重要なことに、Javaのデフォルトの動作を変更して、代わりにその言語に従う方法について、誰かが詳細を提供できますか?

つまり、国ですよね?

答えはメソッドにあります:NumberFormat.getAvailableLocales ()は、次のようになります。NumberFormatProviderは、「en_IT」の正しい値を返すように拡張できる抽象クラスです(これはほとんどit_ITを返します)。NumberFormat

その新しいクラスをインストールする方法は私の知識を超えていますが、jreディレクトリのどこかでそれをハックする必要があると思います。

編集

jre/extクラスはフォルダの下にインストールする必要があると思うので、それだけです。

「gl_ES」(ガリシア語)をサポートするのと同じようなことをしたプロジェクトがどこかにあります

インストール方法とその内容についての説明は次のとおりです。

http://www.javagalician.org/install.html

したがって、基本的に、イタリアに多数のインスタンス(またはさらに良いのは単一のインスタンス)を提供する場合は、NumberFormatProviderのインスタンスを1つ作成し、使用可能なすべての言語に応答させる必要があります。

于 2010-02-17T18:45:18.010 に答える
4

しかし、あなたがイタリアに住んでいるイギリス人なら、今でも数字を英語のように書き、頭の中でお金をポンドで数えている可能性があります-そしてその逆も同様です;-)

したがって、私にはこの動作は完全に論理的に見えます。そして、あなたが望むものを手に入れる方法がないのではないかと心配しています:-(

Oscar Reyes のコメントに基づく更新: Java 6 では、NumberFormatProvider を使用すると、目標を達成できます。

于 2010-02-17T16:23:36.930 に答える
2

あなたの仮定「私がその国にいる場合、私が英語を話すかイタリア語を話すかに関係なく、その国の数字は小数点区切り記号がカンマで書かれているので、国に従うと予想していました。」間違っている。一部のバイリンガルの国では、数字の言語固有の書式設定規則があります。Sun の JDK にフォーマット規則がある国の中で、これはカナダ、インド、およびルクセンブルグに適用されます。

于 2010-02-17T17:15:08.377 に答える
2

Java のすべてを変更することは大きな注文です。私の知る限り、JVM レベルでこれを行う方法はありません。ただし、 DecimalFormatSymbols classを使用して、特定のクラス/プロジェクトの数値形式をほとんどすべてのロケール (または架空のシステム) に手動で設定できます。例と詳細については、フォーマットのカスタマイズに関する Java チュートリアル ページの「Altering the Formatting Symbols」を参照してください。

確かに、プログラムが 3 つまたは 4 つ以上の異なる場所で使用される可能性がある場合、これは最適なアプローチではありませんが、少数しかサポートしていない場合はうまくいく可能性があります。

于 2010-02-17T16:37:02.740 に答える
0

人々が指摘したように、問題は Java が正確なローカルを見つけられない可能性が最も高いため、最も近いと思われる場所に行きました。DecimalFormat オブジェクトがある場合は、必要に応じてセパレータを手動で変更できます。

DecimalFormat format = ...;
DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');
format.setDecimalFormatSymbols(symbols);
于 2012-07-24T19:24:29.797 に答える
0

LocaleServiceProviderを使用して Locale ごとに NumberFormat の動作をオーバーライドできると思います。ただし、これにはJava 6が必要です...

于 2010-02-17T16:36:48.643 に答える
0

私がその国にいる場合、私が英語を話すかイタリア語を話すかに関係なく、その国の数字は小数点区切り記号がカンマで書かれているため、国に続くと予想していました。

いいえ。カナダ (2 つの公用語) など、多くの公用語を持つ一部の国では、言語に基づいて異なる書式設定規則があります。

-1 234,56 (Locale.CANADA_FRENCH)
-1,234.56 (Locale.CANADA (should probably be named CANADA_ENGLISH))
于 2012-07-24T14:34:48.593 に答える