删除不必要的小数

Remove unnecessary decimals

我得到了从数据库中获取浮点数的代码。

for (int i = 0; i < ingredient.size() ; i++) {
    Ingredient ing = (Ingredient) ingredient.get(i);
    ingredients += String.valueOf(ing.getAmount()) + " " +
                   ing.getUnit() + " " + ing.getIngredient() + "\n";
}

数据库是用 REAL 值编写的,因为其中一些是 1.5、2.5、1.4 等。但是我们也有这些不需要小数的整数,例如 1、4、10 等。 问题是数据库 table 需要为 REAL 值,这让我们别无选择,只能给所有值保留一位小数,无论是否需要。

所以我们最终会得到如下值: 1.0 1.5 2.3 20.0 5.0

我的问题是:我们如何删除不需要的小数,但保留需要的小数?

把你从ing.getAmount()返回的String转换成一个Float对象,然后用取模函数判断你的值是否是1的整数倍(即没有小数位) .如果是这样,请将您的 Float 对象转换为 int,这将连接小数。

Float f = Float.valueOf(ing.getAmount());
if(f%1 == 0) {
    // Use f.intValue() to concatenate your decimals.
    ingredients +=String.valueOf(f.intValue() + " " + ing.getUnit() + " " + ing.getIngredient() + "\n";
}
else {
    ingredients +=String.valueOf(ing.getAmount()) + " " + ing.getUnit() + " " + ing.getIngredient() + "\n";
}

希望对您有所帮助。

删除这些的一个非常简单的方法是使用 StringUtils 去除字符。

String displayValue = String.valueOf(ing.getAmount());

displayValue = StringUtils.stripEnd(displayValue, ".0");

对于 "1.0" 的输入,将返回 "1"

一种更技术性的方法是使用模运算符 %

例如:

if(value%1 == 0){  //1 divides into number perfectly, there is no decimal
    //cast value to integer or another non decimal variable
} else {
    //use existing value as it contains a decimal
}

这个怎么样(不需要像 StringUtils 这样的花哨的东西)?

    String s = String.valueOf(1.0);
    System.out.println(s);

    /* Make this block as a function and return an int */
    String ss = " ";
    if (s.charAt(s.length()-2) == '.' && s.charAt(s.length()-1) == '0'){
        ss = s.substring(0,s.length()-2);
        System.out.println(ss);
    }
    /**************************************************/
    int converted = Integer.parseInt(ss);
    System.out.println(converted);

}

如果你想把它做成一个功能块,你可以。

您可以在 IDEONE 上检查它的工作情况 - http://ideone.com/udJv8M

用模数检查浮点值。如果返回 0,则它是一个整数。这是您提到的数字的示例:

    List<Float> values = new ArrayList<Float>();
    values.add(new Float(1.0f));
    values.add(new Float(1.5f));
    values.add(new Float(2.3f));
    values.add(new Float(20.0f));
    values.add(new Float(5.0f));

    List<String> strValues = new ArrayList<String>();

    for(Float value : values)
    {
        String strValue = "";
        if(value % 1 == 0)
        {
            Integer intValue = value.intValue();
            strValue = intValue.toString();
            strValues.add(strValue);
        }
        else
        {
            strValue = value.toString();
            strValues.add(strValue);
        }

        System.out.println(strValue);
    }

您可以使用 custom DecimalFormat pattern:

public static String customFormat(String pattern, double value) {
    DecimalFormat myFormatter = new DecimalFormat(pattern);
    return myFormatter.format(value);
}

然后 # 的模式定义了可选数字的占位符,因此 #.### 将仅在必要时放弃最多 3 个数字。

for (int i = 0; i < ingredient.size() ; i++) {
    Ingredient ing = (Ingredient) ingredient.get(i);
    ingredients += customFormat("#.###", ing.getAmount()) +
                   " " + ing.getUnit() + " " + ing.getIngredient() + "\n";
}

因此,除了仅用于显示之外,不要将您的数据转换为字符串。实数可以使用相同的数据类型表示整数和浮点数。另外,如果您需要对数字进行任何数学运算,则不能使用字符串来做到这一点。如果您在将数字存储到 Ingredient 之前将它们从数据库直接转换为 String,那么如果您想对这些数字进行计算,那么您以后就把自己搞砸了。 (假设您想添加一个功能来将食谱加倍并为用户更改所有数量)。根据你目前的计划,你正在阻止自己做那样的事情,因为你过于关注那个数字的显示。

相反,只需在 Ingredient 上创建一个方法,使用 String.format() 来转换您的数字。像这样:

 public class Ingredient {
     private double amount;
     private String name;

     public String asDecimal() {
         return String.format("%.1f", amount);
     }

     public String asInteger() {
         return String.format("%.0f", amount);
     }

     public String asFraction() {
         // exercise left to the reader
     }
 }

您甚至可以添加一个将小数转换为小数的函数,以便更轻松地显示主管可能理解的内容,而不是更难理解的小数。请记住 String.format() 将舍入浮点数(0.5 -> 1 用作整数)。