我有一系列这样的数据:100Mbps,200Mbps,512Kbps,256Kbps,100Mbps,
我需要将所有数据标准化,这些数据必须以"Mbps"为单位。我使用的是Jaspersoft的ETL软件,它允许输入表达式来转换数据。每个数据将被拆分为两个变量,一个用于存储单位(speedunit),另一个用于保存Double类型的值(speedvalue)。现在我使用以下表达式:
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)))
这里有一个演示:
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类型的变量就足够了。然后,您只需要将结果格式化为所需的十进制格式。
您可以使用类型转换在此处加倍。所以你的表情可以像这个
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