【问题标题】:Expression in java to format Double value into specific decimal pointjava中的表达式将Double值格式化为特定的小数点
【发布时间】:2015-03-23 05:50:42
【问题描述】:

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

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

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

问题是,它将值四舍五入为整数。 例如。 512 假设为 0.512,但改为显示 1。 Math.round 也无济于事。我不能放入任何用户定义的函数。只允许表达。所以它必须是像示例中那样的单行表达式

格式化后的值将保存到 MSSQL 表中,列中的类型为 'decimal(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 将解决decimalformat无法解析为类型的错误
  • 这有助于解决错误。非常感谢你。但输出仍然不是十进制

标签: java double expression decimalformat


【解决方案1】:

这是给你的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 类型的变量就足够了。 然后,您只需将结果格式化为所需的十进制格式。

【讨论】:

  • 这和我上次更新的差不多。我已经通过使用这个 'speedunit.equalsIgnoreCase("kbps") 解决了这个错误? Double.parseDouble(new java.text.DecimalFormat("0.00").format(speedvalue/1000))' 但仍然不是正确的输出
  • 也许我应该包括格式化的值将被保存到 MSSQL 数据库中具有“十进制”类型的列中
  • 我添加了一个演示。请转到上面的链接。你可以看看它生成的结果。
【解决方案2】:

您可以在此处使用类型转换来加倍。所以你的表情可以是这样的

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

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多