用浏览器,我怎么知道哪个小数点分隔符不使用操作系统中的?用浏览器,我怎么知道哪个小数点分隔符不使用操

2019-05-14 12:23发布

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

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

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

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

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

更新:

任务的整点会自动做这件事。

事实上,这个Web应用程序是一种网络接口到传统的GUI,有助于正确填写表格。

使用它的样的用户大多有一个小数点分隔符是什么都不知道。

Accept-Language解决方案的实施和工作,但我想改善它。

UPDATE2:

我需要以检索非常具体的设置:小数点分隔符在设置Control Panel / Regional and Language Options / Regional Options / Customize

我处理4种操作系统:

  1. 俄罗斯窗户用逗号作为DS(80%)。
  2. 英文Windows以句为DS(15%)。
  3. 俄罗斯的Windows以句为DS使写得不好英语应用工作(4%)。
  4. 英文Windows用逗号作为DS使写得不好俄罗斯应用程​​序的工作(1%)。

客户端的所有100%是在俄罗斯和俄罗斯电子政务发行形式的遗留应用程序交易,所以要求的国家将获得俄罗斯联邦的100%,geoip的会产生俄罗斯联邦的80%,其他20%(不正确)答案。

Answer 1:

下面是一个简单的JavaScript函数将返回该信息。 经测试在Firefox,IE6,IE7和。 我必须在每一个变化之间关闭并重新启动我的浏览器控制面板/区域和语言选项/区域选项/自定义下的设置。 然而,拿起不仅逗号和周期,还古怪定制的东西,如字母“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'); 

这是否帮助?



Answer 2:

询问用户,不用猜。 有它在你的web应用程序的设置。

编辑补充:

我认为它是确定猜测的默认设置,工作正常,也就是说,95%的时间。 我的意思是,用户仍然应该能够覆盖任何猜测做出的软件。 当软件试图太聪明,不允许被纠正我已经失望太多次了。



Answer 3:

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;
    }


Answer 4:

检索分隔为当前或给定的语言环境,可以使用Intl.NumberFormat#formatToParts

function getDecimalSeparator(locale) {
    const numberWithDecimalSeparator = 1.1;
    return Intl.NumberFormat(locale)
        .formatToParts(numberWithDecimalSeparator)
        .find(part => part.type === 'decimal')
        .value;
}

它仅适用于浏览器支持的国际API 。 否则,它需要国际填充工具

例子:

> getDecimalSeparator()
"."
> getDecimalSeparator('fr-FR')
","

奖金:

我们可以扩展它来检索无论是小数或给定语言环境的分隔符:

function getSeparator(locale, separatorType) {
        const numberWithGroupAndDecimalSeparator = 1000.1;
        return Intl.NumberFormat(locale)
            .formatToParts(numberWithGroupAndDecimalSeparator)
            .find(part => part.type === separatorType)
            .value;
    }

例子:

> getSeparator('en-US', 'decimal')
"."
> getSeparator('en-US', 'group')
","
> getSeparator('fr-FR', 'decimal')
","
> getSeparator('fr-FR', 'group')
" "


Answer 5:

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

这是IMO最好的行动过程。 为了处理该故障,将链接添加到其设置手动旁显示区域。



Answer 6:

为什么不

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



Answer 7:

我认为你必须依赖于JavaScript给你的区域设置。
但很显然,JS不具有此信息的直接访问。
我看到Dojo Toolkit的依赖外部数据库来查找本地信息,虽然它可能不会在账户设置更改,例如。
另一个解决方法我看到的是有一个细无声Java小程序查询从系统信息和JavaScript把它弄出来的Java。
我可以提供更多的信息,如果你不知道如何做到这一点(如果你想走这令人费解的路线,当然)。

[编辑]所以,我更新了我的Java本地化支持知识...
不像我原以为,你会不会有直接小数点分隔符或千位分隔符的字符直接,就像你用行分隔符或路径分隔符做到:不是Java的API提供格式化您提供的数字或日期。
不知何故,它是有道理的:在欧洲,你经常把货币符号的号码后,一些国家(?印度)有一个更复杂的规则来分隔数字,等等。

另一件事:Java的正确认定从系统的当前区域,但不采取从那里(也许上述原因)的信息。 相反,它使用它自己的一套规则。 所以,如果你有,你代替小数点分隔一个感叹号西班牙语言环境中,Java将不会使用它(但也许既不是你的应用程序,反正...)。

所以我写一个小程序公开服务(功能)为JavaScript,允许数字格式化当前语言环境。 你可以使用它作为这样,使用JavaScript来格式化在浏览器上的数字。 或者你也可以用一些样本数量喂养它,并从那里提取的符号,利用它们在本地或喂养它们回服务器。

我完成和测试我的小程序,不久后它。



Answer 8:

OK,我有东西给,更多的是概念大于成品的证据,但由于缺乏确切的规格,我把它这种方式(或者我将在工程师的话)。 我张贴在一个单独的消息,因为这将是一个有点长。 我借此机会尝试多一点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>

在测试了火狐3.0,IE 6,Safari浏览器3.1和Opera 9.50,在Windows XP专业版SP3。 它的工作原理没有问题与前两种,在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)

但它仍然有效。

我无法得到它与戏曲工作:正确的小程序负载,因为我可以看到初始化的痕迹()调用Java控制台,我没有错误,当调用JavaScript的Java函数(除非我添加和调用方法得到一个JSObject参数,奇怪),但Java功能不叫(我加入了通话的痕迹)。
我相信LiveConnect的工作在歌剧,但我看不出怎么还。 我将研究多一点。
[更新]我删除到不存在的jar文件的引用(这并不阻止其他浏览器)和我得到了呼叫的痕迹,但它并没有更新页面。
嗯,如果我做alert(applet.GetLocaleInformation()); 我得到的信息,所以它可能是一个jQuery的问题。



Answer 9:

即使你知道这“GUI应用程序”下运行的区域,你还是要弄清楚是如何让当前的语言环境,以及是如何确定小数点分隔符。

我不知道它是如何在Mac上完成的,但在Windows应用程序都应该interrogte用户的喜好通过控制面板设置。 它很可能这个谜应用程序是有忽略那些设置,并使用他们自己的内部设置代替。

或者,也许他们正在考虑当前的语言环境,并推断休息,而不是被告知。

即使这样,在英语中, 编号为3位数字组给定的,用逗号分隔的组。 即:

5,197,359,078

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

519-735-9078

当然,除非数量是包含一个帐号整数:

5197359078

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

编辑:删除货币例如,由于货币都有自己的格式规则。



Answer 10:

用别人解答了我整理了以下的小数和千位分隔符的实用功能:

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

请享用!



Answer 11:

“有没有办法做到这一点的服务器端(最好,这样我就可以收集统计信息),或在客户端?”

不,你不能。 这个GUI是寻找一些用户或计算机特定的设置。 首先,你可能不知道这个UI是看什么设置。 其次,随着web应用,你可能会无法检查这些设置(客户方 - > Javacsript)。



Answer 12:

另一种可能的解决方案:你可以使用类似的GeoIP (例如PHP)来确定用户的位置,并根据这些信息决定。



文章来源: With a browser, how do I know which decimal separator does the operating system use?