使用浏览器,我如何知道操作系统使用哪个小数分隔符?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用浏览器,我如何知道操作系统使用哪个小数分隔符?相关的知识,希望对你有一定的参考价值。
我正在开发一个Web应用程序。
我需要正确显示一些十进制数据,以便可以将其复制并粘贴到不受我控制的某个GUI
应用程序中。
GUI应用程序是区域设置敏感的,它只接受在系统中设置的正确的小数分隔符。
我可以猜测来自Accept-Language
的小数分隔符,并且在95%的情况下猜测是正确的,但有时它会失败。
有没有办法在服务器端(最好是我可以收集统计数据),或在客户端?
更新:
任务的重点是自动完成。
事实上,这个webapp是一种传统GUI的在线界面,有助于正确填写表单。
使用它的用户大多不知道小数分隔符是什么。
Accept-Language
解决方案已实施并正常运行,但我想改进它。
UPDATE2:
我需要检索一个非常具体的设置:在qazxsw poi中设置小数分隔符。
我处理四种操作系统:
- 俄语Windows用逗号作为DS(80%)。
- 英文版Windows,期间为DS(15%)。
- 俄罗斯Windows用一段时间作为DS来制作写得不好的英文应用程序(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以上是关于使用浏览器,我如何知道操作系统使用哪个小数分隔符?的主要内容,如果未能解决你的问题,请参考以下文章