如何从Java中的OS读取"列表分隔符"?

Sim*_*n07 8 java csv operating-system regional list-separator

我正在编写一个Java导出器,它应该尊重用户的自定义设置,尤其是用作分隔符的"列表分隔符".

在Windows中,可以设置此List分隔符

Control Panel -> Regional and Language Options -> Regional Options -> Customize
Run Code Online (Sandbox Code Playgroud)

我不知道其他操作系统,但我很确定你也可以在其他操作系统上改变它.

将此自定义设置从操作系统转换为Java的最佳方法是什么?我在Eclipse RCP环境中,所以如果有可用的话,我可能会使用与RCP相关的解决方案.

nin*_*ded 6

如果不采用特定于平台的解决方案,我认为最好的方法是允许用户在自己的应用程序中指定列表分隔符的首选项.在首选项面板中,导出时的对话框或通过可选的命令行参数.


Jon*_*nik 6

这个答案的评论:

读取特定于操作系统的设置是我必须要满足的.

那么,如果Windows以外的操作系统没有这样的设置怎么办?

我建议你从Windows注册表中读取它(如提到这里):读取使用Java Windows注册表/写.在其他平台上只使用一个很好的默认值,也许,至少在Unix上,也支持通过自定义环境变量(你很好地记录)配置它:我的java代码如何读取OS环境变量?.

我的直觉是操作系统普遍没有(系统范围或用户特定的)"列表分隔符"设置可能是错误的,当然,但我怀疑.


rom*_*eok 5

除了在应用程序中为用户提供自己的选项之外,您还可以尝试猜测列表分隔符是什么.

我看了一下Windows中的一些语言环境,看到列表分隔符是";" 要么 ",".我听说在一些不起眼的地方还有另一个角色,但我自己也没见过.因此,如果您可以使您的代码同时处理";" 和","作为列表分隔符,那么你可能会涵盖大多数情况.

此外,看起来当","用作小数分隔符时,","从不用作列表分隔符.我猜这是否则数字将无法在列表中区分:1,2,3,4可能是1.2,3.4或1,2.3在这些情况下";" 用作列表分隔符.不幸的是,事实并非如此.阿拉伯语有"." 作为小数符号和";" 作为列表分隔符.

所以我认为可以合理安全地遵循的规则是:

if (decimalSeparator == ',') 
    then listSeparator = ';'
else if (decimalSeparator == '.') 
    then listSeparator = new char[] {';', ','}
Run Code Online (Sandbox Code Playgroud)