我正在开发一个Web应用程序.
我需要正确显示一些十进制数据,以便可以将其复制并粘贴到GUI
不受我控制的某个应用程序中.
GUI应用程序是区域设置敏感的,它只接受在系统中设置的正确的小数分隔符.
我可以猜测小数分隔符Accept-Language
和猜测在95%的情况下是正确的,但有时它会失败.
有没有办法在服务器端(最好是我可以收集统计数据),或在客户端?
更新:
任务的重点是自动完成.
事实上,这个webapp是一种传统GUI的在线界面,有助于正确填写表单.
使用它的用户大多不知道小数分隔符是什么.
该Accept-Language
解决方案的实施和工作,但我想改善它.
UPDATE2:
我需要检索一个非常具体的设置:小数分隔符设置Control Panel / Regional and Language Options / Regional Options / Customize
.
我处理四种操作系统:
俄语Windows用逗号作为DS(80%).
英文版Windows,期间为DS(15%).
俄罗斯Windows用一段时间作为DS来制作写得不好的英文应用程序(4%).
使用逗号作为DS的英文Windows可以使写得不好的俄语应用程序正常工作(1%).
所有100%的客户都在俄罗斯,遗留申请涉及俄罗斯政府发布的表格,因此要求一个国家将收取100%的俄罗斯联邦,GeoIP将收益80%的俄罗斯联邦和20%的其他(不正确)答案.
这是一个简单的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');
询问用户,不要猜.在您的Web应用程序中设置它.
编辑添加:
我认为可以猜测默认设置是否正常,比如95%的时间.我的意思是用户应该仍然能够覆盖软件所做的任何猜测.当软件试图太聪明并且不允许纠正时,我已经沮丧太多次了.
可以使用检索当前或给定语言环境的分隔符Intl.NumberFormat#formatToParts
.
function getDecimalSeparator(locale) { const numberWithDecimalSeparator = 1.1; return Intl.NumberFormat(locale) .formatToParts(numberWithDecimalSeparator) .find(part => part.type === 'decimal') .value; }
它仅适用于支持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; }
例子:
> getSeparator('en-US', 'decimal') "." > getSeparator('en-US', 'group') "," > getSeparator('fr-FR', 'decimal') "," > getSeparator('fr-FR', 'group') " "
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; }
为什么不
0.1.toLocaleString().replace(/\d/g, '')
我可以从Accept-Language中猜出小数分隔符,并且在95%的情况下猜测是正确的,但有时它会失败.
这是IMO最好的行动方案.为了处理故障,请添加一个链接以在显示区域旁边手动设置.