我正在开发一个Web应用程序。
我需要正确显示某些十进制数据,以便它可以被复制并粘贴到一定的GUI
应用程序,是不是我的控制之下。
GUI应用程序是语言环境敏感的,它仅接受其在系统中设置了正确的小数分隔符。
我可以猜到从小数点分隔符Accept-Language
和猜测会在95%的情况下是正确的,但有时它会失败。
有没有办法做到这一点的服务器端(最好,这样我就可以收集统计信息),或在客户端?
更新:
任务的整点会自动做这件事。
事实上,这个Web应用程序是一种网络接口到传统的GUI,有助于正确填写表格。
使用它的样的用户大多有一个小数点分隔符是什么都不知道。
在Accept-Language
解决方案的实施和工作,但我想改善它。
UPDATE2:
我需要以检索非常具体的设置:小数点分隔符在设置Control Panel / Regional and Language Options / Regional Options / Customize
。
我处理4种操作系统:
- 俄罗斯窗户用逗号作为DS(80%)。
- 英文Windows以句为DS(15%)。
- 俄罗斯的Windows以句为DS使写得不好英语应用工作(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?