java中的表达式将Double值格式化为特定的小数点

时间:2015-03-23 05:50:43

标签: java double expression decimalformat

我有一系列数据如下: 100 Mbps, 200 Mbps, 512 Kbps, 256 Kbps, 100 Mbps,

我需要标准化所有必须在' Mbps'单元。我正在使用Jaspersoft的ETL软件,它允许输入表达式来转换数据。每个数据将被分成2个变量,一个用于存储单元(speedunit),另一个用于存储值(speedvalue),类型为Double。现在我使用以下表达式:

speedunit.equalsIgnoreCase("Kbps") ? (speedvalue / 1000) : speedunit.equalsIgnoreCase("Gbps") ? (speedvalue * 1000) : Var.speedvalue 

问题是,它将值向上舍入为整数。 例如。 512假设为0.512,而是显示1。 Math.round也没有帮助。我不能放入任何用户定义的功能。只允许表达式。所以它必须是一个单行表达式,如示例

然后,格式化的值将保存到列中的MSSQL表中,该表的类型为'十进制(28,2)'

更新 试过这个但是没有工作

speedunit.equalsIgnoreCase("kbps") ? Mathematical.REAL(String.valueOf(speedvalue/1000))

这会产生错误" DecimalFormat无法解析为类型"

speedunit.equalsIgnoreCase("kbps") ? new DecimalFormat("0.00").format(String.valueOf(speedvalue / 1000)))

2 个答案:

答案 0 :(得分:0)

你可以在这里使用类型转换加倍。所以你的表达可以像这样

speedunit.equalsIgnoreCase("Kbps") ? 
    (double)(speedvalue / 1000) 
    : speedunit.equalsIgnoreCase("Gbps") ? (double)(speedvalue * 1000) 
    : speedvalue

10/100的评估会为您0提供(double)10/100的评估,为您提供0.1

如果要将小数限制为特定的位数,可以使用下面的表达式(限制为两位小数)

speedunit.equalsIgnoreCase("Kbps") ? 
    (double)Math.round(100*((double)(speedvalue / 1000))/100 
    : speedunit.equalsIgnoreCase("Gbps") ? 
    (double)Math.round(100*((double)(speedvalue * 1000))/100 
    : speedvalue

如果您想限制为三位小数,请将100更改为1000。使用java.text.DecimalFormat是格式化数字的更好方法。使用乘法和除以Math.round()是一个解决方案,这些库不可用。

如果您可以使用DecimalFormat,那么您的最佳解决方案将是

speedunit.equalsIgnoreCase("Kbps") ? 
    new DecimalFormat("0.00").format(String.valueOf((double)(speedvalue / 1000))/100 
    : speedunit.equalsIgnoreCase("Gbps") ? 
    new DecimalFormat("0.00").format(String.valueOf((double)(speedvalue * 1000))/100 
    : speedvalue

答案 1 :(得分:0)

以下是demo

import java.text.DecimalFormat;


public class DecimalFormatDemo {

    public static void main(String[] args) {
        String speedunit = "Kbps";
        double speedvalue = 512;
        double result = 
                speedunit.equalsIgnoreCase("Kbps") ? (speedvalue / 1000) : speedunit.equalsIgnoreCase("Gbps") ? (speedvalue * 1000) : speedvalue;
        DecimalFormat df = new DecimalFormat("0.000");
        System.out.println(df.format(result));

    }
}

注意:

由于speedvalue的类型为" double" 将结果分配给 double 类型的变量就足够了。 然后,您只需要将结果格式化为所需的十进制格式。