用浏览器,我怎么知道客户端使用哪个小数点分隔符?

我正在开发一个Web应用程序。

我需要正确显示一些十进制数据,以便它可以复制并粘贴到某个不受我控制的GUI应用程序中。

GUI应用程序是语言环境敏感的,它只接受在系统中设置的正确的小数点分隔符。

我可以猜测Accept-Language的小数点分隔符,在95%的情况下猜测是正确的,但有时会失败。

有没有办法在服务器端做(最好,这样我可以收集统计),或在客户端?

更新:

整个任务的重点是自动完成。

事实上,这个Web应用程序是一种在线界面,可以帮助正确填写表格。

使用它的用户大多不知道小数分隔符是什么。

Accept-Language解决scheme已经实现并且可行,但是我想改进它。

UPDATE2:

我需要回顾一个非常具体的设置:在Control Panel / Regional and Language Options / Regional Options / Customize设置小数点分隔符。

我处理四种操作系统:

  1. 用逗号作为DS的俄语Windows(80%)。
  2. 英文Windows以期限作为DS(15%)。
  3. 俄罗斯的Windows有一段时间作为一个DS,使英文应用程序写得不好(4%)。
  4. 用逗号作为DS的英文Windows,使俄文应用程序写得不好(1%)。

所有100%的客户都在俄罗斯,遗留申请涉及俄罗斯政府签发的表格,因此要求一个国家将产生100%的俄罗斯联邦,GeoIP将产生80%的俄罗斯联邦和20%的其他(不正确的)答案。

这是一个简单的JavaScript函数,将返回这个信息。 testingFirefox,IE6和IE7。 在“控制面板”/“区域”和“语言选项”/“区域选项”/“自定义”下,每次更改设置之间,都必须closures并重新启动浏览器。 然而,它不仅收录了逗号和时期,还收录了一些习俗的东西,比如字母“a”。

 function whatDecimalSeparator() { var n = 1.1; n = n.toLocaleString().substring(1, 2); return n; } 
 function whatDecimalSeparator() { var n = 1.1; n = n.toLocaleString().substring(1, 2); return n; } console.log('You use "' + whatDecimalSeparator() + '" as Decimal seprator'); 

询问用户,不要猜测。 在您的Web应用程序中进行设置。

编辑添加:

我认为可以猜测可以正常工作的默认设置,比如95%的时间。 我的意思是,用户仍然可以覆盖软件所做的任何猜测。 当一个软件过于聪明并且不允许纠正时,我已经挫败了很多次了。

 function getDecimalSeparator() { //fallback var decSep = "."; try { // this works in FF, Chrome, IE, Safari and Opera var sep = parseFloat(3/2).toLocaleString().substring(1,2); if (sep === '.' || sep === ',') { decSep = sep; } } catch(e){} return decSep; } 

我可以猜测接受语言的小数点分隔符,在95%的情况下猜测是正确的,但有时会失败。

这是IMO最好的行动方针。 为了处理这些故障,请添加一个链接,将其手动设置在显示区旁边。

好吧,我有东西要展示,比成品更多的是概念certificate,但是由于缺乏精确的规格,我就这样离开了(或者我会过度devise它)。 我在一个单独的消息发布,因为它会有点长。 我趁机尝试了更多的jQuery …

Java代码: GetLocaleInfo.java

 import java.applet.*; import java.util.Locale; import java.text.*; public class GetLocaleInfo extends Applet { Locale loc; NumberFormat nf; NumberFormat cnf; NumberFormat pnf; // For running as plain application public static void main(String args[]) { final Applet applet = new GetLocaleInfo(); applet.init(); applet.start(); } public void init() // Applet is loaded { // Use current locale loc = Locale.getDefault(); nf = NumberFormat.getInstance(); cnf = NumberFormat.getCurrencyInstance(); pnf = NumberFormat.getPercentInstance(); } public void start() // Applet should start { // Following output goes to Java console System.out.println(GetLocaleInformation()); System.out.println(nf.format(0.1)); System.out.println(cnf.format(1.0)); System.out.println(pnf.format(0.01)); } public String GetLocaleInformation() { return String.format("Locale for %s: country=%s (%s / %s), lang=%s (%s / %s), variant=%s (%s)", loc.getDisplayName(), loc.getDisplayCountry(), loc.getCountry(), loc.getISO3Country(), loc.getDisplayLanguage(), loc.getLanguage(), loc.getISO3Language(), loc.getDisplayVariant(), loc.getVariant() ); } public String FormatNumber(String number) { double value = 0; try { value = Double.parseDouble(number); } catch (NumberFormatException nfe) { return "!"; } return nf.format(value); } public String FormatCurrency(String number) { double value = 0; try { value = Double.parseDouble(number); } catch (NumberFormatException nfe) { return "!"; } return cnf.format(value); } public String FormatPercent(String number) { double value = 0; try { value = Double.parseDouble(number); } catch (NumberFormatException nfe) { return "!"; } return pnf.format(value); } } 

使用上述小程序的HTML页面示例: GetLocaleInfo.html

 <!-- Header skipped for brevity --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js"></script> <script type="text/javascript"> var applet; $(document).ready(function() { applet = document.getElementById('LocaleInfo'); $('#Results').text(applet.GetLocaleInformation()); }); </script> <script type="text/javascript"> function DoFormatting() { $('table.toFormat').each(function() { var table = $(this); $('td', table).each(function(cellId) { var val = $(this); if (val.is('.number')) { val.text(applet.FormatNumber(val.text())); } else if (val.is('.currency')) { val.text(applet.FormatCurrency(val.text())); } else if (val.is('.percent')) { val.text(applet.FormatPercent(val.text())); } }); }); } </script> </head> <body> <div id="Container"> <p>Page to demonstrate how JavaScript can get locale information from Java</p> <div id="AppletContainer"> <object classid="java:GetLocaleInfo.class" type="application/x-java-applet" codetype="application/java" name="LocaleInfo" id="LocaleInfo" width="0" height="0"> <param name="code" value="GetLocaleInfo"/> <param name="mayscript" value="true"/> <param name="scriptable" value="true"/> <p><!-- Displayed if object isn't supported --> <strong>This browser does not have Java enabled.</strong> <br> <a href="http://java.sun.com/products/plugin/downloads/index.html" title="Download Java plug-in"> Get the latest Java plug-in here </a> (or enable Java support). </p> </object> </div><!-- AppletContainer --> <p> Click on the button to format the table content to the locale rules of the user. </p> <input type="button" name="DoFormatting" id="DoFormatting" value="Format the table" onclick="javascript:DoFormatting()"/> <div id="Results"> </div><!-- Results --> <table class="toFormat"> <caption>Synthetic View</caption> <thead><tr> <th>Name</th><th>Value</th><th>Cost</th><th>Discount</th> </tr></thead> <tbody> <tr><td>Foo</td><td class="number">3.1415926</td><td class="currency">21.36</td><td class="percent">0.196</td></tr> <tr><td>Bar</td><td class="number">159263.14</td><td class="currency">33</td><td class="percent">0.33</td></tr> <tr><td>Baz</td><td class="number">15926</td><td class="currency">12.99</td><td class="percent">0.05</td></tr> <tr><td>Doh</td><td class="number">0.01415926</td><td class="currency">5.1</td><td class="percent">0.1</td></tr> </tbody> </table> </div><!-- Container --> </body> </html> 

在Windows XP Pro SP3上testingFirefox 3.0,IE 6,Safari 3.1和Opera 9.50。 它的工作原理没有问题,前两个,在Safari()调用后,我有一个奇怪的错误:

 java.net.MalformedURLException: no protocol: at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source) at sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source) at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source) 

但它仍然有效。

我无法使用Opera:applet加载正确,因为我可以在Java控制台中看到init()调用的踪迹,JavaScript在调用Java函数时没有错误(除非添加并调用方法得到一个JSObject参数,好奇地),但Java函数不被调用(我添加了调用的跟踪)。
我相信Liveconnect在Opera中工作,但我还没有看到如何。 我会再研究一下。
[更新]我删除了对不存在的jar文件的引用(不停止其他浏览器),我得到了一些调用,但不会更新页面。
嗯,如果我做alert(applet.GetLocaleInformation()); 我得到的信息,所以这可能是一个jQuery的问题。

为什么不

 0.1.toLocaleString().replace(/\d/g, '') 

我认为你必须依靠JavaScript来为你提供区域设置。
但显然JS没有直接访问这些信息。
我看到Dojo Toolkit依靠外部数据库来查找语言环境信息,例如,它可能不考虑设置更改。
我看到的另一个解决方法是有一个小的静默Java小程序,从系统查询这些信息,JavaScript从Java中获取它。
如果你不知道该怎么做,我可以提供更多的信息(当然,如果你想走这条错综复杂的路线)。

[编辑]所以我更新了我在Java中本地化支持的知识…
不像我原先想的那样,你不会直接使用小数分隔符或千位分隔符字符,就像使用行分隔符或path分隔符一样:而是提供API来格式化您提供的数字或date。
不知何故,这是有道理的:在欧洲,你经常把货币符号放在数字之后,一些国家(印度?)有更复杂的规则来分隔数字等等。

另一件事:Java正确地从系统中find当前的语言环境,但不从那里获取信息(可能是出于以上原因)。 相反,它使用自己的一套规则。 所以,如果你有一个西class牙语的区域设置,你用小叹号代替了十进制分隔符,Java就不会使用它(但是也许你的应用程序,不pipe怎么说…)。

所以我正在写一个小程序,向JavaScript公开一个服务(函数),允许将数字格式化为当前的语言环境。 您可以使用它,使用JavaScript在浏览器上格式化数字。 或者你可以给它提供一些样本号码,并从那里提取符号,在本地使用它们或将它们反馈给服务器。

我完成并testing我的小程序,并很快发布。

即使你知道这个“GUI应用程序”正在运行的区域,你仍然需要弄清楚是如何得到当前的区域,以及是如何确定小数点分隔符的。

我不知道它是如何在Mac上完成的,但在Windows应用程序应该询问通过控制面板设置的用户偏好。 这个神秘应用程序很可能会忽略这些设置,而是使用自己的内部设置。

也许他们正在采取当前的地点,并推断其余的,而不是被告知。

即使如此,英文中的数字也是以3位数字分组,用逗号分隔组。 即:

 5,197,359,078 

除非数字是包含电话号码的整数:

 519-735-9078 

除非这个号码是一个包含帐号的整数:

 5197359078 

在这种情况下,你又回到了硬编码的重载逻辑。

编辑:删除货币的例子,因为货币有自己的格式化规则。

“有没有办法在服务器端(最好是我可以收集统计数据),或在客户端?

不,你不能。 该GUI正在查看一些用户或机器的特定设置。 首先,你可能不知道这个UI在什么设置。 其次,对于一个web应用程序,你可能无法检查这些设置(clientside – > Javacsript)。

使用其他人的答案我编译了下面的小数点和千分号实用程序函数:

 var decimalSeparator = function() { return (1.1).toLocaleString().substring(1, 2); }; var thousandSeparator = function() { return (1000).toLocaleString().substring(1, 2); }; 

请享用!

另一个可能的解决scheme:你可以使用像GeoIP这样的东西(例如PHP)来确定用户的位置,并根据这些信息来决定。