在Java中将字符串转换为数字

16

如何将一个字符串转换为抽象数字,假设该字符串是Java中的任何有效数字(例如int、long、double等)。

我不知道字符串中数字的类型,因此无法使用特定的基元解析(如Integer.parseInt,Long.parseLong等)。有没有通用的方法来转换它?

例如:

  • 字符串 -> 数字
  • "23423" -> 23423
  • "34.3" -> 34.3
  • "45364573747546" -> 45364573747546

1
你可以直接使用 Double.parseDouble()。这个方法适用于上述所有示例。 - Code-Apprentice
使用 Number 类? - ThisaruG
Number类是抽象的,因此无法使用它。NumberFormat / DecimalFormat可以胜任此工作。谢谢。 - Lakshan Prabhu
9个回答

19

使用NumberFormat。Number不能被实例化因为它是一个抽象类。

 Number number = NumberFormat.getInstance().parse(string);

1
并且,NumberFormat可以被替换为例如DecimalFormat,但是没错,NumberFormat是一个不错的选择。 - MatWdo
3
这种方法唯一的缺点是,只要以数字开头,它也会将明显的文本字符串解析为数字。例如,“1.Textfield”将被解析为1,没有例外。 - hvsp
对于 "1.123 / 4",它返回 1.123。 - Farkas István
4
注意:NumberFormat.getInstance返回的是一个通用的数字格式,适用于当前默认格式的地区。如果您不想根据不同的地区把 2.000 解析为 22000,那么应该指定与输入预期格式相匹配的地区。请注意这一点。 - Hulk

1

两种情况:

  1. 如果您输入的字符串长度小于8个字节:

double primitiveNumber = Double.parseDouble(input);

  1. 如果您输入的字符串长度大于8个字节:无论如何都无法将其存储在原始数据类型中,那么您可以使用Number类,但这不太可能发生,因为您期望得到一个原始数据类型。

1

Double 类型的值如果过长,会失去精度。

应该使用 BigDecimal 类型替代:

BigDecimal number = new BigDecimal("43.256");

您可以按以下方式获取不同的原语:

try {
  int intValue = number.intValueExact();
} catch (ArithmeticException e) {
  try {
    long longValue = number.longValueExact();
  } catch (ArithmeticException e) {
    double doubleValue = number.doubleValue();
  }
}

0

Double.valueOf() 很好用,除非你有一个非常长的数字。


1
valueOf() 返回的是 Double,而不是原始类型。 - Code-Apprentice
1
@Code-Apprentice OP说他不能使用特定于原始类型的方法,并且他要求一种通用的方法。通用的不能是原始类型,否则就必须是特定的(而OP想要一种通用的方法)。 - BackSlash

0

最快的方法是始终使用Double.parseDouble()。如果您需要一个通用解析器来确定要使用哪种原始类型,而不是始终使用相同的类型,则需要编写自己的解析器。一种方法是使用每个parseXxx()方法和大量的try...catch语句。


0

我更喜欢使用BigDecimal。因为它不会出现大小和精度问题。


0

对于整数:

int myInteger = Integer.parseInt("23423");

对于双精度浮点数:

double myDouble = Double.parseDouble("34.3");

0
只要您的字符串可能是大数字(假设不超过原始长和双精度),那么通用的方法就可以确定它是长整型还是双精度型。
Number n = Double.valueOf(string);
if((double)n.intValue() == n.doubleValue()){
   //n is double use n.doubleValue() or just use the n for generic purposes
}
else{
   //n is int use n.intValue() or just use the n for generic purposes
}

0

你可以使用 Double.parseDouble() 将字符串转换为双精度浮点数。即使字符串是整数也可以使用此方法:

String myString = "1234.56";
double myDouble = Double.parseDouble(myString);

如果您需要检查它是整数还是双精度浮点数:

String myString = "1234.56";
int myInt;
double myDouble = Double.parseDouble(myString);
if ((myDouble % 1) == 0) {
   myInt = (int) myDouble;
   System.out.println("myString is an integer: " + myInt );       
} else {
   System.out.println("myString is a double: " + myDouble );    
}

或者你可以使用GuavaDoubleMath.isMathematicalInteger()

String myString = "1234.56";
int myInt;
double myDouble = Double.parseDouble(myString);
if (DoubleMath.isMathematicalInteger(myDouble)) {
   myInt = (int) myDouble;
   System.out.println("myString is an integer: " + myInt );       
} else {
   System.out.println("myString is a double: " + myDouble );    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接