Java Birt报告印度卢比格式
由于某些条件原因,我想通过脚本将数字格式化为基于印度卢比/数字格式,基本上是Birt中的逗号 如果我使用:Java Birt报告印度卢比格式,java,format,report,birt,number-formatting,Java,Format,Report,Birt,Number Formatting,由于某些条件原因,我想通过脚本将数字格式化为基于印度卢比/数字格式,基本上是Birt中的逗号 如果我使用: this.getStyle().numberFormat="#,##,##,##0.000"; 它仍然会在每3个字符后添加逗号。。与12345678.000相同,但我希望此格式中的数字为1,23,45678.000 你能给我一些建议吗 编辑:BIRT引发的错误为:您可以通过将区域设置设置为Indian设置来使用 Locale locale = new Locale("en","IN");
this.getStyle().numberFormat="#,##,##,##0.000";
它仍然会在每3个字符后添加逗号。。与12345678.000相同,但我希望此格式中的数字为1,23,45678.000
你能给我一些建议吗
编辑:BIRT引发的错误为:您可以通过将区域设置设置为Indian设置来使用
Locale locale = new Locale("en","IN");
String str = NumberFormat.getNumberInstance(locale).format(<your number>);
如果您正在寻找JAVA代码来解决您的问题,就可以使用它。编辑:设置自定义格式编号 下面是一个可能的解决方法,强制BIRT使用com.ibm.icu.text.DecimalFormat类。我不知道为什么印度格式本机不受支持,您可以在eclipse.org网站的bugzilla中报告这一点 编辑数据集 创建新的计算列,选择字符串数据类型 输入为表达式:在第一行中,将value替换为包含值的数字列的实际名称
var columnvalue=row["value"], customformat="#,##,##,##0.000"; //we can add here a test for conditional formatting
if (columnvalue!=null){
var symbols=Packages.com.ibm.icu.text.DecimalFormatSymbols(new Packages.java.util.Locale("en","IN"));
var formatter=Packages.com.ibm.icu.text.DecimalFormat(customformat,symbols);
var value=new Packages.java.math.BigDecimal(columnvalue.toString());
formatter.format(value);
}else{
"-"
}
单击“数据集编辑器”中的“预览结果”,应在末尾添加具有预期格式的新列
这是为Birt报告脚本编写的吗?看来Birt没有使用正确的NumberFormat类来解决这个问题。BIRT允许使用java.text.NumberFormat格式化数字,而处理印度格式的类是com.ibm.icu.text.NumberFormat。我认为这就是它不起作用的原因。虽然我能够生成预期的格式1,2345678.000,但只生成字符串格式,而不是数字。如果字符串数据类型适合您的上下文,我可以发布我用作答案的表达式。您可以发布该表达式,以便对某人有所帮助。。如果不是我:-。。毕竟,努力不应该白费。。我们如何向Birt管理员/社区提出这个问题?谢谢Dominique。。这很酷。我也提出了这个错误:感谢你提供了伊玛目的答案——对于这样的答案——你应该为使这成为问题解决方案/答案的关键要素添加一些解释——这样社区也会理解你为解决这个问题所做的事。
**you can use following javascript currency format and call it from BIRT.
function getSouthAsianCurrencyFormat(amount)
{
var l,ftemp,temp,camount,k,adecimal;
var decimals=2;
var ptrn="##,##,###,##,##,###.##";
var ptrnLength=0;
var adecimal=0;
var counts = {};
var ch, index, len, count;
amount= Number(Math.round(amount+'e'+decimals)+'e-'+decimals);
amount=amount.toFixed( decimals );
for (index = 0, len = ptrn.length; index < len; ++index) {
ch = ptrn.charAt(index);
count = counts[ch];
counts[ch] = count ? count + 1 : 1;
}
for (ch in counts) {
if(ch=="#"){
ptrnLength=counts[ch];
console.log(ch + " count: " + ptrnLength+"("+ptrn.length+")");
console.log( "amount length: " + amount.toString().length);
//console.log("decimalLength: "+decimalLength.toString().length);
}
}
if(counts['.']=0){
amount=amount+".00";
}
k=ptrn.toString().length;
l=amount.toString().length;
ftemp=amount.toString();
temp="";
camount="";
if(ptrnLength<(amount.toString().length-1)) return 0;
else {
k=k-1;
l=l-1;
for(i=l;i>-1;i--){
if(ptrn.charAt(k)=="#" || ptrn.charAt(k)=="." ){
camount=ftemp.charAt(i)+camount;
}
else{
camount=ptrn.charAt(k)+camount;
k=k-1;
if(ptrn.charAt(k)=="#"){
camount=ftemp.charAt(i)+camount;
}
}
k=k-1;
}
return (camount);
}
}