使用浏览器,我如何知道操作系统使用哪个小数分隔符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用浏览器,我如何知道操作系统使用哪个小数分隔符?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

更新:

任务的重点是自动完成。

事实上,这个webapp是一种传统GUI的在线界面,有助于正确填写表单。

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

Accept-Language解决方案已实施并正常运行,但我想改进它。

UPDATE2:

我需要检索一个非常具体的设置:在qazxsw poi中设置小数分隔符。

我处理四种操作系统:

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

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

答案

这是一个简单的javascript函数,它将返回此信息。在Firefox,IE6和IE7中测试过。我必须在每次更改控制面板/区域和语言选项/区域选项/自定义下的设置之间关闭并重新启动浏览器。然而,它不仅包括逗号和句号,还包括古怪的自定义内容,如字母“a”。

Control Panel / Regional and Language Options / Regional Options / Customize

function whatDecimalSeparator() {
    var n = 1.1;
    n = n.toLocaleString().substring(1, 2);
    return n;
}
另一答案

使用其他人的答案我编译了以下十进制和千位分隔符实用程序函数:

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); }; php中的示例)来确定用户的位置并根据这些信息做出决定。

另一答案

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

编辑添加:

我认为可以猜测默认设置是否正常,比如95%的时间。我的意思是用户应该仍然能够覆盖软件所做的任何猜测。当软件试图太聪明并且不允许纠正时,我已经沮丧太多次了。

另一答案
function whatDecimalSeparator() {
    var n = 1.1;
    n = n.toLocaleString().substring(1, 2);
    return n;
}

console.log('You use "' + whatDecimalSeparator() + '" as Decimal seprator');
另一答案

使用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; } 可以检索当前或给定语言环境的分隔符。

Intl.NumberFormat#formatToParts

它只适用于function getDecimalSeparator(locale) { const numberWithDecimalSeparator = 1.1; return Intl.NumberFormat(locale) .formatToParts(numberWithDecimalSeparator) .find(part => part.type === 'decimal') .value; } 。否则它需要一个browsers supporting the Intl API

例子:

Intl polyfill

奖金:

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

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

例子:

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

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

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

另一答案

为什么不

> getSeparator('en-US', 'decimal')
"."
> getSeparator('en-US', 'group')
","
> getSeparator('fr-FR', 'decimal')
","
> getSeparator('fr-FR', 'group')
" "
另一答案

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

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

另一件事:Java正确地从系统中找到当前的语言环境,但不从那里获取信息(可能是出于上述原因)。相反,它使用自己的一套规则。因此,如果你有一个西班牙语语言环境,你用感叹号替换小数分隔符,Java将不会使用它(但可能既不是你的应用程序,无论如何......)。

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

我完成并测试了我的applet并很快将其发​​布到那里。

另一答案

好的,我有东西要展示,更多的是概念证明,而不是成品,但由于缺乏精确的规格,我就这样离开(或者我会过度设计它)。我发布了一个单独的消息,因为它会有点长。我借此机会尝试了更多jQuery ......

Java代码:GetLocaleInfo.java

Dojo Toolkit

使用上述applet的html页面示例:GetLocaleInfo.html

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

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

<!-- 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.tex

以上是关于使用浏览器,我如何知道操作系统使用哪个小数分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何检测文本文件中使用了哪个分隔符?

如何强制数字显示 2 位小数?

在 Python 2 中使用逗号分隔符格式化数字并舍入到小数点后 2 位?

在NopCommerce中发布时,浏览器会添加零

如何使用开放 XML 检索 excel 的文化信息?

如何接收具有由小数点分隔的数字的用户输入并将该输入存储为不带小数点的 int?