删除不必要的小数
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 用作整数)。
我得到了从数据库中获取浮点数的代码。
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 用作整数)。