質問

ユーザーのカスタム設定、特に「リストセパレーター」を尊重する必要があるJavaのCSVエクスポーターを作成しています。区切り文字として使用します。

Windowsでは、このリスト区切り文字を設定できます

Control Panel -> Regional and Language Options -> Regional Options -> Customize

他のオペレーティングシステムについては知りませんが、他のOSでも同様に変更できると確信しています。

OSからJavaにこのカスタム設定を取得する最良の方法は何ですか?私はEclipse RCP環境にいるので、何か利用可能なものがある場合はRCP関連のソリューションを使用するかもしれません。

役に立ちましたか?

解決

この回答のコメントから

  

OS固有の設定を読むことは、私が満たす必要がある 必要です。

では、Windows以外のOSにこのような設定がない 場合はどうなりますか?

Windowsのレジストリから読むことをお勧めします(こちら): Windowsレジストリへの読み取り/書き込みJavaを使用。他のプラットフォームでは、適切なデフォルトを使用するだけで、おそらく少なくともUnixでは、カスタム環境変数を使用した構成もサポートしています(これについてはよく文書化されています):私のJavaコードはOS環境変数をどのように読み取ることができますか?

OSには普遍的に(システム全体またはユーザー固有の)「リスト区切り文字」がないと思うもちろん設定は間違っているかもしれませんが、私はそれを疑います。

他のヒント

プラットフォーム固有のソリューションに頼ることなく、最善のアプローチは、ユーザーが自分のアプリケーション内でリストセパレーターの設定を指定できるようにすることだと思います独自のアプリケーション内。設定パネル、エクスポート時のダイアログボックス、またはオプションのコマンドライン引数を使用します。

アプリケーションのユーザーに独自のオプションを提供することに加えて、リストの区切り文字を推測することもできます。

Windowsの一部のロケールを見て、リスト区切り文字が&quot ;;"または"、"。いくつかのあいまいなロケールに別のキャラクターがいると聞いたことがありますが、自分では見ていません。したがって、両方の&quot ;;"を処理するコードを作成できる場合および"、"リストの区切りとして、おそらく大部分のケースをカバーします。

また、"、"小数点区切り記号として使用され、次に「、」リスト区切り文字として使用されることはありません。そうでなければ、リストで数字を区別することは不可能になります:1,2,3,4は1.2、3.4または1、2.3リスト区切り文字として使用されます。残念ながら、その逆は当てはまりません。アラビア語には「。」があります。小数点記号として&quot ;;"リストの区切りとして。

だから、合理的に安全に従うことができるルールは次のとおりだと思います:

if (decimalSeparator == ',') 
    then listSeparator = ';'
else if (decimalSeparator == '.') 
    then listSeparator = new char[] {';', ','}

好奇心から、私は少しトピックを検索しましたが、実際、Javaにはそのような概念は箱から出していないようです。

Locales Demo は、ロケール設定があり、そこにリスト区切り記号はありません。

フォーラムの質問は、非公開で非推奨のsun.text.resourcesパッケージを参照しています。これに関する他の参照はほとんどありませんパッケージは、jre / lib / ext / localedata.jarにあるように見えますが、このパッケージの最近のコピーはほとんどがアジアのロケールをリストしています。

上記のアドバイスは適切です。または、ロケールごとにプライベートリストを調べて使用することもできます。 IBMのICUライブラリ(私が思うにC言語)を見ると、ロケール設定のかなり大きなリストがあるようです。 、ICU自体はISO規格から情報を取得しますが、これは主要な情報プロバイダーとして調査する必要があります。

同じ問題に直面し、「適切な区切り文字」を指定する方法をユーザーに提供することが唯一の適切な解決策であることもわかりました。

ただし、それが不可能な場合、私の場合のように、クロスプラットフォームからクロスロケールに最も近いサポートは次のとおりです:

  • DecimalFormatSymbolsを使用して使用する必要があるセパレーターを推測します
  • CSVの先頭に、たとえば" sep =、"を含む行を追加します。 (引用符なし)、これは推測したばかりのリスト区切り文字を指定する必要があります

これにより、少なくともほとんどの場合(私がテストした場合)、「間違っていると推測した」場合でも、Excelはその区切り文字を使用するように強制されます。少なくとももう少し互換性があります。

まあ、これは深刻なトピックだと思います!

WindowsにはExcelがあります。そして、多くのプログラムがそれと対話しなければなりません。 Excelでは、リスト区切り記号ロケール(セル区切り)を使用します。

基本的な問題は、“カンマ区切り値”小数点記号と同じリスト区切り文字を使用できないため、米国(スペイン語(米国))および英語以外では機能しません。したがって、米国と英語以外の世界(NATOロケール、10進数のコンマなど、およびISOメジャーに従う(べき)米国軍隊を含む)は、; をスプレッドシート内のセルを区切るリスト区切り文字として使用します。コンマ。

一般に、リスト区切り文字のロケールWindows設定は; です。ただし、英語または米国のリスト区切り文字はです。

Excelには、特に米国/英語のCSVの不便さがあります。デフォルトの米国と英語の設定では、同じ文字は千単位の区切り記号であり、Excelsは非常に重要です(使用されているCSVをインポートすると、セルがねじ込まれます)。桁区切り記号のスキップ(リスト区切り記号と同じ場合)Excelは通貨セルを認識せず、テキストとして受け取ります。米国と英語の環境で一緒に暮らさなければならないものもあれば、世界中でうまく機能するものもあります(; を使用)。

おもしろいこと(面白い考え)は、WindowsのJavaがWin32ライブラリアクセスでNDKをサポートするかどうかですWin32では

を呼び出すため
GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SLIST, pwListSeparator, 4); 

リスト区切り文字を取得するJavaソリューションが見つかりませんか?

提案はハードコードされた一般規則を使用し、リスト区切り文字をに設定します;小数点区切り文字がの場合は、リスト区切り文字をに設定し、 ロケールメソッドまたはWin32のような設定で別の文字が見つからない場合。リストのセパレータと同じ場合は、千のセパレータを削除します(使用しないでください)。

またはタブ付きテキストファイルを使用しますか?唯一の不便は、Windowsがデフォルトで.csvファイルでExcelを開き、ShellExecute(0、0、pwFileName、0、 0、SW_SHOW);。

注目すべきは、Javaに小数点と千の区切りが存在することです。使用する必要があると思います。

import java.text.DecimalFormatSymbols;
new DecimalFormatSymbols().getDecimalSeparator();
new DecimalFormatSymbols().getGroupingSeparator();

Windowsの場合、次のレジストリに保存されます。

"HKEY_CURRENT_USER\\Control Panel\\International"

そのため、このようなものを使用できます

private void setDelimiterProperties(String delimiter) {
    Properties p = new Properties();
    String key = "HKEY_CURRENT_USER\\Control Panel\\International\\sList";
    p.setProperty(key, delimiter);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top