概述
在Java中,将Float
类型转换为String
,反之亦然,是一项常见的操作。然而,实现这一转换的方式众多,可能会让人困惑,不知道选择哪种方法。本文将展示并比较所有可用的选项。
1. 引言
首先,我们来看看将Float
值转换为String
的常见方法。
1.1. 字符串连接
最直接的方法是将浮点数值与空字符串连接起来:
float givenFloat = 1.25f;
String result = givenFloat + "";
assertEquals("1.25", result);
同样地,我们也可以将Float
对象添加到空字符串中,得到相同的结果。当使用Float
对象时,其toString()
方法会自动被调用:
Float givenFloat = 1.25f;
String result = givenFloat + "";
assertEquals("1.25", result);
如果Float
对象为null
,连接结果将是“null”字符串:
Float givenFloat = null;
String result = givenFloat + "";
assertEquals("null", result);
1.2. Float.toString()
另一种选择是使用Float
类的静态toString()
方法进行转换。我们可以传入float
基本类型值或Float
对象:
Float givenFloat = 1.25f;
String result = Float.toString(givenFloat);
assertEquals("1.25", result);
如果将null
作为参数传递给该方法,运行时会出现NullPointerException
:
Float givenFloat = null;
assertThrows(NullPointerException.class, () -> Float.toString(givenFloat));
1.3. String.valueOf()
类似地,我们可以使用String
的静态valueOf()
方法:
Float givenFloat = 1.25f;
String result = String.valueOf(givenFloat);
assertEquals("1.25", result);
与Float.toString()
不同的是,如果传递null
作为参数,valueOf()
不会抛出异常,而是返回“null”字符串:
Float givenFloat = null;
String result = String.valueOf(givenFloat);
assertEquals("null", result);
1.4. String.format()
String
的format()
静态方法提供了额外的格式化选项。需要注意的是,如果没有限制小数位数,即使没有小数部分,结果也会包含多余的零。例如:
Float givenFloat = 1.25f;
String result = String.format("%f", givenFloat);
assertEquals("1.250000", result);
当我们指定小数点后的小数位数时,format()
方法会进行四舍五入:
Float givenFloat = 1.256f;
String result = String.format("%.2f", givenFloat);
assertEquals("1.26", result);
如果传递null
的Float
,转换后的结果将是“null”字符串:
Float givenFloat = null;
String result = String.format("%f", givenFloat);
assertEquals("null", result);
1.5. DecimalFormat
最后,DecimalFormat
类的format()
方法允许我们将浮点数值转换为自定义格式的字符串。优点在于,我们可以精确地定义输出字符串中小数点后的位数。
下面是一个示例演示如何使用它:
Float givenFloat = 1.25f;
String result = new DecimalFormat("#.0000").format(givenFloat);
assertEquals("1.2500", result);
如果格式化后没有小数部分,DecimalFormat
将返回整数:
Float givenFloat = 1.0025f;
String result = new DecimalFormat("#.##").format(givenFloat);
assertEquals("1", result);
如果传递null
作为参数,将抛出IllegalArgumentException
:
Float givenFloat = null;
assertThrows(IllegalArgumentException.class, () -> new DecimalFormat("#.000").format(givenFloat));
2. String
到Float
接下来,我们看看将String
值转换为Float
的常见方法。
2.1. Float.parseFloat()
最常见的方法之一是使用Float
的静态方法parseFloat()
。它会将String
参数表示的浮点数值转换为float
基本类型值。同时,它会忽略前后空格:
String givenString = "1.25";
float result = Float.parseFloat(givenString);
assertEquals(1.25f, result);
如果String
参数为null
,会抛出NullPointerException
:
String givenString = null;
assertThrows(NullPointerException.class, () -> Float.parseFloat(givenString));
如果String
参数不能解析为浮点数,会抛出NumberFormatException
:
String givenString = "1.23x";
assertThrows(NumberFormatException.class, () -> Float.parseFloat(givenString));
2.2. Float.valueOf()
类似地,我们可以使用Float
的静态valueOf()
方法。区别在于valueOf()
返回一个Float
对象。具体来说,它会调用parseFloat()
方法并将结果封装成一个Float
对象:
String givenString = "1.25";
Float result = Float.valueOf(givenString);
assertEquals(1.25f, result);
同样,如果传递无法解析的String
,会抛出NumberFormatException
:
String givenString = "1.25x";
assertThrows(NumberFormatException.class, () -> Float.valueOf(givenString));
2.3. DecimalFormat
我们也可以使用DecimalFormat
来将String
转换为Float
。其中一个主要优势是可以指定自定义的小数点分隔符。
String givenString = "1,250";
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#.000");
decimalFormat.setDecimalFormatSymbols(symbols);
Float result = decimalFormat.parse(givenString).floatValue();
assertEquals(1.25f, result);
2.4. Float
构造函数
最后,可以直接使用Float
的构造函数进行转换。内部它会调用Float
的静态parseFloat()
方法,并创建一个Float
对象:
String givenString = "1.25";
Float result = new Float(givenString);
assertEquals(1.25f, result);
从Java 9开始,这个构造函数已经被弃用。建议使用其他静态工厂方法,如parseFloat()
或valueOf()
。
3. 总结
本文探讨了将String
实例转换为float
或Float
实例,以及反过来的多种方式。对于简单的转换,字符串连接和Float.toString()
是将Float
转换为String
的理想选择。如果需要更复杂的格式化,DecimalFormat
是最合适的工具。在将字符串转换为浮点数值时,如果需要float
基本类型,可以使用Float.parseFloat()
;如果偏好Float
对象,可以使用Float.valueOf()
。同样,对于自定义格式化,DecimalFormat
是最佳选项。
所有示例代码可在GitHub上获取。